forked from fnproject/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
base.go
125 lines (111 loc) · 4.21 KB
/
base.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package langs
import (
"errors"
"fmt"
"os"
)
// not a map because some helpers can handle multiple keys
var helpers = []LangHelper{}
func init() {
registerHelper(&DotNetLangHelper{})
registerHelper(&GoLangHelper{})
registerHelper(&JavaLangHelper{version: "1.8"})
registerHelper(&JavaLangHelper{version: "9"})
registerHelper(&LambdaNodeHelper{})
registerHelper(&NodeLangHelper{})
registerHelper(&PhpLangHelper{})
registerHelper(&PythonLangHelper{Version: "2.7.13"})
registerHelper(&PythonLangHelper{Version: "3.6"})
registerHelper(&RubyLangHelper{})
registerHelper(&RustLangHelper{})
}
func registerHelper(h LangHelper) {
helpers = append(helpers, h)
}
func Helpers() []LangHelper {
return helpers
}
var (
ErrBoilerplateExists = errors.New("Function boilerplate already exists")
)
// GetLangHelper returns a LangHelper for the passed in language
func GetLangHelper(lang string) LangHelper {
for _, h := range helpers {
if h.Handles(lang) {
return h
}
}
return nil
}
// LangHelper is the interface that language helpers must implement.
type LangHelper interface {
// Handles return whether it can handle the passed in lang string or not
Handles(string) bool
// LangStrings returns list of supported language strings user can use for runtime
LangStrings() []string
// Extension is the file extension this helper supports. Eg: .java, .go, .js
Extensions() []string
// Runtime that will be used for the build (includes version)
Runtime() string
// BuildFromImage is the base image to build off, typically fnproject/LANG:dev
BuildFromImage() (string, error)
// RunFromImage is the base image to use for deployment (usually smaller than the build images)
RunFromImage() (string, error)
// If set to false, it will use a single Docker build step, rather than multi-stage
IsMultiStage() bool
// Dockerfile build lines for building dependencies or anything else language specific
DockerfileBuildCmds() []string
// DockerfileCopyCmds will run in second/final stage of multi-stage build to copy artifacts form the build stage
DockerfileCopyCmds() []string
// Entrypoint sets the Docker Entrypoint. One of Entrypoint or Cmd is required.
Entrypoint() (string, error)
// Cmd sets the Docker command. One of Entrypoint or Cmd is required.
Cmd() (string, error)
// DefaultFormat provides the default fn format to set in func.yaml fn init, return "" for an empty format.
DefaultFormat() string
HasPreBuild() bool
PreBuild() error
AfterBuild() error
// HasBoilerplate indicates whether a language has support for generating function boilerplate.
HasBoilerplate() bool
// GenerateBoilerplate generates basic function boilerplate. Returns ErrBoilerplateExists if the function file
// already exists.
GenerateBoilerplate() error
// FixImagesOnInit determines if images should be fixed on initialization - BuildFromImage and RunFromImage will be written to func.yaml
FixImagesOnInit() bool
}
func defaultHandles(h LangHelper, lang string) bool {
for _, s := range h.LangStrings() {
if lang == s {
return true
}
}
return false
}
// BaseHelper is empty implementation of LangHelper for embedding in implementations.
type BaseHelper struct {
}
func (h *BaseHelper) IsMultiStage() bool { return true }
func (h *BaseHelper) DockerfileBuildCmds() []string { return []string{} }
func (h *BaseHelper) DockerfileCopyCmds() []string { return []string{} }
func (h *BaseHelper) Entrypoint() (string, error) { return "", nil }
func (h *BaseHelper) Cmd() (string, error) { return "", nil }
func (h *BaseHelper) HasPreBuild() bool { return false }
func (h *BaseHelper) PreBuild() error { return nil }
func (h *BaseHelper) AfterBuild() error { return nil }
func (h *BaseHelper) HasBoilerplate() bool { return false }
func (h *BaseHelper) GenerateBoilerplate() error { return nil }
func (h *BaseHelper) DefaultFormat() string { return "" }
func (h *BaseHelper) FixImagesOnInit() bool { return false }
// exists checks if a file exists
func exists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func dockerBuildError(err error) error {
return fmt.Errorf("error running docker build: %v", err)
}