config.go 10.5 KB
Newer Older
H
hongming 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
Copyright 2020 The KubeSphere Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

17 18 19 20 21
package config

import (
	"fmt"
	"github.com/spf13/viper"
22
	networkv1alpha1 "kubesphere.io/kubesphere/pkg/apis/network/v1alpha1"
23
	authoptions "kubesphere.io/kubesphere/pkg/apiserver/authentication/options"
H
hongming 已提交
24
	authorizationoptions "kubesphere.io/kubesphere/pkg/apiserver/authorization/options"
J
Jeff 已提交
25
	"kubesphere.io/kubesphere/pkg/simple/client/alerting"
26
	"kubesphere.io/kubesphere/pkg/simple/client/auditing"
Z
zryfish 已提交
27
	"kubesphere.io/kubesphere/pkg/simple/client/cache"
R
runzexia 已提交
28
	"kubesphere.io/kubesphere/pkg/simple/client/devops/jenkins"
29
	"kubesphere.io/kubesphere/pkg/simple/client/events"
30 31
	"kubesphere.io/kubesphere/pkg/simple/client/k8s"
	"kubesphere.io/kubesphere/pkg/simple/client/ldap"
32
	"kubesphere.io/kubesphere/pkg/simple/client/logging"
G
Guangzhe Huang 已提交
33
	"kubesphere.io/kubesphere/pkg/simple/client/monitoring/prometheus"
H
hongming 已提交
34
	"kubesphere.io/kubesphere/pkg/simple/client/multicluster"
35
	"kubesphere.io/kubesphere/pkg/simple/client/network"
J
Jeff 已提交
36
	"kubesphere.io/kubesphere/pkg/simple/client/notification"
37
	"kubesphere.io/kubesphere/pkg/simple/client/openpitrix"
Z
zryfish 已提交
38
	"kubesphere.io/kubesphere/pkg/simple/client/s3"
39 40
	"kubesphere.io/kubesphere/pkg/simple/client/servicemesh"
	"kubesphere.io/kubesphere/pkg/simple/client/sonarqube"
J
Jeff 已提交
41 42
	"reflect"
	"strings"
43 44
)

J
Jeff 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
// Package config saves configuration for running KubeSphere components
//
// Config can be configured from command line flags and configuration file.
// Command line flags hold higher priority than configuration file. But if
// component Endpoint/Host/APIServer was left empty, all of that component
// command line flags will be ignored, use configuration file instead.
// For example, we have configuration file
//
// mysql:
//   host: mysql.kubesphere-system.svc
//   username: root
//   password: password
//
// At the same time, have command line flags like following:
//
// --mysql-host mysql.openpitrix-system.svc --mysql-username king --mysql-password 1234
//
// We will use `king:1234@mysql.openpitrix-system.svc` from command line flags rather
// than `root:password@mysql.kubesphere-system.svc` from configuration file,
// cause command line has higher priority. But if command line flags like following:
//
// --mysql-username root --mysql-password password
//
68
// we will `root:password@mysql.kubesphere-system.svc` as input, cause
J
Jeff 已提交
69 70 71
// mysql-host is missing in command line flags, all other mysql command line flags
// will be ignored.

72
const (
J
Jeff 已提交
73
	// DefaultConfigurationName is the default name of configuration
74
	defaultConfigurationName = "kubesphere"
J
Jeff 已提交
75 76

	// DefaultConfigurationPath the default location of the configuration file
77
	defaultConfigurationPath = "/etc/kubesphere"
78 79
)

80
// Config defines everything needed for apiserver to deal with external services
81
type Config struct {
H
hongming 已提交
82 83 84 85 86 87 88 89 90 91
	DevopsOptions         *jenkins.Options                           `json:"devops,omitempty" yaml:"devops,omitempty" mapstructure:"devops"`
	SonarQubeOptions      *sonarqube.Options                         `json:"sonarqube,omitempty" yaml:"sonarQube,omitempty" mapstructure:"sonarqube"`
	KubernetesOptions     *k8s.KubernetesOptions                     `json:"kubernetes,omitempty" yaml:"kubernetes,omitempty" mapstructure:"kubernetes"`
	ServiceMeshOptions    *servicemesh.Options                       `json:"servicemesh,omitempty" yaml:"servicemesh,omitempty" mapstructure:"servicemesh"`
	NetworkOptions        *network.Options                           `json:"network,omitempty" yaml:"network,omitempty" mapstructure:"network"`
	LdapOptions           *ldap.Options                              `json:"-,omitempty" yaml:"ldap,omitempty" mapstructure:"ldap"`
	RedisOptions          *cache.Options                             `json:"redis,omitempty" yaml:"redis,omitempty" mapstructure:"redis"`
	S3Options             *s3.Options                                `json:"s3,omitempty" yaml:"s3,omitempty" mapstructure:"s3"`
	OpenPitrixOptions     *openpitrix.Options                        `json:"openpitrix,omitempty" yaml:"openpitrix,omitempty" mapstructure:"openpitrix"`
	MonitoringOptions     *prometheus.Options                        `json:"monitoring,omitempty" yaml:"monitoring,omitempty" mapstructure:"monitoring"`
92
	LoggingOptions        *logging.Options                           `json:"logging,omitempty" yaml:"logging,omitempty" mapstructure:"logging"`
H
hongming 已提交
93
	AuthenticationOptions *authoptions.AuthenticationOptions         `json:"authentication,omitempty" yaml:"authentication,omitempty" mapstructure:"authentication"`
H
hongming 已提交
94
	AuthorizationOptions  *authorizationoptions.AuthorizationOptions `json:"authorization,omitempty" yaml:"authorization,omitempty" mapstructure:"authorization"`
H
hongming 已提交
95
	MultiClusterOptions   *multicluster.Options                      `json:"multicluster,omitempty" yaml:"multicluster,omitempty" mapstructure:"multicluster"`
96 97
	EventsOptions         *events.Options                            `json:"events,omitempty" yaml:"events,omitempty" mapstructure:"events"`
	AuditingOptions       *auditing.Options                          `json:"auditing,omitempty" yaml:"auditing,omitempty" mapstructure:"auditing"`
98 99
	AlertingOptions       *alerting.Options                          `json:"alerting,omitempty" yaml:"alerting,omitempty" mapstructure:"alerting"`
	NotificationOptions   *notification.Options                      `json:"notification,omitempty" yaml:"notification,omitempty" mapstructure:"notification"`
100 101
}

102 103
// newConfig creates a default non-empty Config
func New() *Config {
104
	return &Config{
105 106 107 108
		DevopsOptions:         jenkins.NewDevopsOptions(),
		SonarQubeOptions:      sonarqube.NewSonarQubeOptions(),
		KubernetesOptions:     k8s.NewKubernetesOptions(),
		ServiceMeshOptions:    servicemesh.NewServiceMeshOptions(),
109
		NetworkOptions:        network.NewNetworkOptions(),
110 111 112 113 114 115 116
		LdapOptions:           ldap.NewOptions(),
		RedisOptions:          cache.NewRedisOptions(),
		S3Options:             s3.NewS3Options(),
		OpenPitrixOptions:     openpitrix.NewOptions(),
		MonitoringOptions:     prometheus.NewPrometheusOptions(),
		AlertingOptions:       alerting.NewAlertingOptions(),
		NotificationOptions:   notification.NewNotificationOptions(),
117
		LoggingOptions:        logging.NewLoggingOptions(),
118
		AuthenticationOptions: authoptions.NewAuthenticateOptions(),
H
hongming 已提交
119
		AuthorizationOptions:  authorizationoptions.NewAuthorizationOptions(),
H
hongming 已提交
120
		MultiClusterOptions:   multicluster.NewOptions(),
121 122
		EventsOptions:         events.NewEventsOptions(),
		AuditingOptions:       auditing.NewAuditingOptions(),
123 124 125
	}
}

126 127 128 129 130
// TryLoadFromDisk loads configuration from default location after server startup
// return nil error if configuration file not exists
func TryLoadFromDisk() (*Config, error) {
	viper.SetConfigName(defaultConfigurationName)
	viper.AddConfigPath(defaultConfigurationPath)
131

132 133
	// Load from current working directory, only used for debugging
	viper.AddConfigPath(".")
134

135 136 137 138 139 140
	if err := viper.ReadInConfig(); err != nil {
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			return nil, err
		} else {
			return nil, fmt.Errorf("error parsing configuration file %s", err)
		}
J
Jeff 已提交
141 142
	}

143
	conf := New()
144

145 146
	if err := viper.Unmarshal(conf); err != nil {
		return nil, err
J
Jeff 已提交
147 148
	}

149 150
	return conf, nil
}
151

152 153
// convertToMap simply converts config to map[string]bool
// to hide sensitive information
154 155
func (conf *Config) ToMap() map[string]bool {
	conf.stripEmptyOptions()
156
	result := make(map[string]bool, 0)
157

158 159
	if conf == nil {
		return result
160 161
	}

162
	c := reflect.Indirect(reflect.ValueOf(conf))
163

164 165 166 167 168
	for i := 0; i < c.NumField(); i++ {
		name := strings.Split(c.Type().Field(i).Tag.Get("json"), ",")[0]
		if strings.HasPrefix(name, "-") {
			continue
		}
169

170 171 172
		if name == "network" {
			ippoolName := "network.ippool"
			nsnpName := "network"
173
			networkTopologyName := "network.topology"
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
			if conf.NetworkOptions == nil {
				result[nsnpName] = false
				result[ippoolName] = false
			} else {
				if conf.NetworkOptions.EnableNetworkPolicy {
					result[nsnpName] = true
				} else {
					result[nsnpName] = false
				}

				if conf.NetworkOptions.IPPoolType == networkv1alpha1.IPPoolTypeNone {
					result[ippoolName] = false
				} else {
					result[ippoolName] = true
				}
189 190 191 192 193 194

				if conf.NetworkOptions.WeaveScopeHost == "" {
					result[networkTopologyName] = false
				} else {
					result[networkTopologyName] = true
				}
195 196 197 198
			}
			continue
		}

199 200 201 202 203
		if c.Field(i).IsNil() {
			result[name] = false
		} else {
			result[name] = true
		}
204
	}
205 206

	return result
207
}
J
Jeff 已提交
208

Z
zryfish 已提交
209
// Remove invalid options before serializing to json or yaml
210
func (conf *Config) stripEmptyOptions() {
J
Jeff 已提交
211

Z
zryfish 已提交
212
	if conf.RedisOptions != nil && conf.RedisOptions.Host == "" {
213
		conf.RedisOptions = nil
J
Jeff 已提交
214 215
	}

216 217
	if conf.DevopsOptions != nil && conf.DevopsOptions.Host == "" {
		conf.DevopsOptions = nil
J
Jeff 已提交
218 219
	}

220
	if conf.MonitoringOptions != nil && conf.MonitoringOptions.Endpoint == "" {
221
		conf.MonitoringOptions = nil
J
Jeff 已提交
222 223
	}

224 225
	if conf.SonarQubeOptions != nil && conf.SonarQubeOptions.Host == "" {
		conf.SonarQubeOptions = nil
J
Jeff 已提交
226 227
	}

228 229
	if conf.LdapOptions != nil && conf.LdapOptions.Host == "" {
		conf.LdapOptions = nil
J
Jeff 已提交
230 231
	}

232 233
	if conf.OpenPitrixOptions != nil && conf.OpenPitrixOptions.IsEmpty() {
		conf.OpenPitrixOptions = nil
J
Jeff 已提交
234 235
	}

236
	if conf.NetworkOptions != nil && conf.NetworkOptions.IsEmpty() {
237 238 239
		conf.NetworkOptions = nil
	}

240 241 242 243
	if conf.ServiceMeshOptions != nil && conf.ServiceMeshOptions.IstioPilotHost == "" &&
		conf.ServiceMeshOptions.ServicemeshPrometheusHost == "" &&
		conf.ServiceMeshOptions.JaegerQueryHost == "" {
		conf.ServiceMeshOptions = nil
J
Jeff 已提交
244 245
	}

246 247
	if conf.S3Options != nil && conf.S3Options.Endpoint == "" {
		conf.S3Options = nil
J
Jeff 已提交
248 249
	}

250 251
	if conf.AlertingOptions != nil && conf.AlertingOptions.Endpoint == "" &&
		conf.AlertingOptions.PrometheusEndpoint == "" && conf.AlertingOptions.ThanosRulerEndpoint == "" {
252
		conf.AlertingOptions = nil
J
Jeff 已提交
253 254
	}

255 256
	if conf.LoggingOptions != nil && conf.LoggingOptions.Host == "" {
		conf.LoggingOptions = nil
J
Jeff 已提交
257 258
	}

259 260
	if conf.NotificationOptions != nil && conf.NotificationOptions.Endpoint == "" {
		conf.NotificationOptions = nil
J
Jeff 已提交
261 262
	}

Z
zryfish 已提交
263 264 265
	if conf.MultiClusterOptions != nil && !conf.MultiClusterOptions.Enable {
		conf.MultiClusterOptions = nil
	}
J
junotx 已提交
266 267 268 269

	if conf.EventsOptions != nil && conf.EventsOptions.Host == "" {
		conf.EventsOptions = nil
	}
R
root 已提交
270 271 272 273

	if conf.AuditingOptions != nil && conf.AuditingOptions.Host == "" {
		conf.AuditingOptions = nil
	}
J
Jeff 已提交
274
}