-
Notifications
You must be signed in to change notification settings - Fork 786
/
features.go
149 lines (129 loc) · 3.95 KB
/
features.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package features
import (
"errors"
"strings"
"reflect"
"github.com/jenkins-x/jx-logging/pkg/log"
"github.com/rollout/rox-go/core/context"
"github.com/rollout/rox-go/server"
"github.com/spf13/cobra"
)
// API key, populated at build-time.
var FeatureFlagToken string
//flag to indicate if it's the oss version
var oss bool
// Features Flags
type Features struct {
// types of Jenkins X installations
Tekton server.RoxFlag
StaticJenkins server.RoxFlag
// Supported Cloud Providers
AKS server.RoxFlag
AWS server.RoxFlag
EKS server.RoxFlag
GKE server.RoxFlag
ICP server.RoxFlag
IKS server.RoxFlag
OKE server.RoxFlag
Kubernetes server.RoxFlag
Minikube server.RoxFlag
Openshift server.RoxFlag
// Supported build packs
Java server.RoxFlag
Go server.RoxFlag
Node server.RoxFlag
}
var features = &Features{
Tekton: server.NewRoxFlag(false),
StaticJenkins: server.NewRoxFlag(false),
AKS: server.NewRoxFlag(false),
AWS: server.NewRoxFlag(false),
EKS: server.NewRoxFlag(false),
GKE: server.NewRoxFlag(false),
ICP: server.NewRoxFlag(false),
IKS: server.NewRoxFlag(false),
OKE: server.NewRoxFlag(false),
Kubernetes: server.NewRoxFlag(false),
Minikube: server.NewRoxFlag(false),
Openshift: server.NewRoxFlag(false),
Java: server.NewRoxFlag(false),
Go: server.NewRoxFlag(false),
Node: server.NewRoxFlag(false),
}
var rox *server.Rox
var ctx context.Context
// SetFeatureFlagToken - used to set the API key in the tests
// todo remove this I have a better idea
func SetFeatureFlagToken(token string) {
FeatureFlagToken = token
}
// IsFeatureEnabled - determines if the feature flag mechanism is enabled
func IsFeatureEnabled() bool {
return FeatureFlagToken != "oss" && FeatureFlagToken != ""
}
// Init - initialise the feature flag mechanism
func Init() {
if IsFeatureEnabled() {
log.Logger().Infof("Cloudbees Jenkins X distribution - only supported features enabled")
oss = false
// todo probably want the cloudbees login here
ctx = context.NewContext(map[string]interface{}{"user": "N/A"})
rox = server.NewRox()
rox.Register("jx", features)
roxOptions := server.NewRoxOptions(server.RoxOptionsBuilder{})
<-rox.Setup(FeatureFlagToken, roxOptions)
} else {
log.Logger().Debugf("OSS version - all features enabled")
oss = true
}
}
// CheckTektonEnabled checks if tekton is enabled
func CheckTektonEnabled() error {
if !oss {
log.Logger().Debug("Checking if Tekton enabled")
if !features.Tekton.IsEnabled(ctx) {
return errors.New("tekton not supported in CloudBees Distribution of Jenkins X")
}
log.Logger().Debug("Tekton enabled")
}
return nil
}
// CheckStaticJenkins checks if static jenkins master is enabled
func CheckStaticJenkins() error {
if !oss {
log.Logger().Debug("Checking if static jenkins master enabled")
if !features.StaticJenkins.IsEnabled(ctx) {
return errors.New("static jenkins master not supported in CloudBees Distribution of Jenkins X")
}
log.Logger().Debug("Static Jenkins Master enabled")
}
return nil
}
func isProviderEnabled(provider string) bool {
log.Logger().Debugf("Is Provider enabled for %s", provider)
v := reflect.ValueOf(features).Elem()
f := v.FieldByName(strings.ToUpper(provider))
original, ok := f.Interface().(server.RoxFlag)
enabled := false
if ok {
enabled = original.IsEnabled(ctx)
}
log.Logger().Debugf("Provider is enabled %t", enabled)
return enabled
}
//Checks if a Cobra command has been enabled
func IsEnabled(cmd *cobra.Command) error {
if !oss {
parent := cmd.Parent()
if parent.Name() == "cluster" {
log.Logger().Debug("Checking if provider is enabled")
provider := cmd.Name()
log.Logger().Debugf("Provider %s", provider)
enabled := isProviderEnabled(provider)
if !enabled {
return errors.New("command not supported in CloudBees Distribution of Jenkins X")
}
}
}
return nil
}