shardingsphere-operator/pkg/kubernetes/configmap/builders.go (218 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package configmap
import (
"reflect"
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
"gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
const (
// ConfigDataKeyForLogback refers to the configuration file name of logback
ConfigDataKeyForLogback = "logback.xml"
// ConfigDataKeyForServer refers to the configuration file name of server
ConfigDataKeyForServer = "server.yaml"
// ConfigDataKeyForAgent refers to the configuration file name of agent
ConfigDataKeyForAgent = "agent.yaml"
// AnnoClusterRepoConfig refers to the content of logback.xml
AnnoLogbackConfig = "computenode.shardingsphere.org/logback"
// DefaultLogback contains the default logback config
DefaultLogback = `<?xml version="1.0"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="sqlConsole" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{database}] [%X{user}] [%X{host}] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="ShardingSphere-SQL" level="info" additivity="false">
<appender-ref ref="sqlConsole" />
</logger>
<logger name="org.apache.shardingsphere" level="info" additivity="false">
<appender-ref ref="console" />
</logger>
<logger name="com.zaxxer.hikari" level="error" />
<logger name="com.atomikos" level="error" />
<logger name="io.netty" level="error" />
<root>
<level value="info" />
<appender-ref ref="console" />
</root>
</configuration>
`
// DefaultServerConfig contains the default server config
DefaultServerConfig = "# Empty file is needed"
)
// DefaultConfigMap returns a ConfigMap filling with default expected values
func DefaultConfigMap(meta metav1.Object, gvk schema.GroupVersionKind) *corev1.ConfigMap {
return &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "shardingsphere-proxy",
Namespace: "default",
Labels: map[string]string{},
OwnerReferences: []metav1.OwnerReference{
*metav1.NewControllerRef(meta, gvk),
},
},
Data: map[string]string{},
}
}
// NewConfigMap returns a new ConfigMap
func NewConfigMap(obj runtime.Object) *corev1.ConfigMap {
factory := NewConfigMapFactory(obj)
gvk := obj.GetObjectKind().GroupVersionKind()
var (
cn *v1alpha1.ComputeNode
sc *v1alpha1.Chaos
meta metav1.Object
ok bool
)
if cn, ok = obj.(*v1alpha1.ComputeNode); ok {
meta = cn.GetObjectMeta()
return factory.NewConfigMapBuilder(meta, gvk).Build()
}
if sc, ok = obj.(*v1alpha1.Chaos); ok {
meta = sc.GetObjectMeta()
return factory.NewConfigMapBuilder(meta, gvk).Build()
}
return &corev1.ConfigMap{}
}
// UpdateConfigMap returns a new ConfigMap
func UpdateComputeNodeConfigMap(cn *v1alpha1.ComputeNode, cur *corev1.ConfigMap) *corev1.ConfigMap {
exp := &corev1.ConfigMap{}
exp.ObjectMeta = cur.ObjectMeta
exp.Labels = cur.Labels
exp.Annotations = cur.Annotations
exp.Data = NewConfigMap(cn).Data
return exp
}
type computeNodeConfigMapBuilder struct {
configMapBuilder
obj runtime.Object
}
// SetData sets the data of ConfigMap
func (c *computeNodeConfigMapBuilder) SetData(data map[string]string) ConfigMapBuilder {
if c.configmap.Data == nil {
c.configmap.Data = map[string]string{}
}
if val, ok := data[ConfigDataKeyForServer]; ok {
c.configmap.Data[ConfigDataKeyForServer] = val
}
if val, ok := data[ConfigDataKeyForLogback]; ok {
c.configmap.Data[ConfigDataKeyForLogback] = val
}
if val, ok := data[ConfigDataKeyForAgent]; ok {
c.configmap.Data[ConfigDataKeyForAgent] = val
}
return c
}
// SetBinaryData sets the binary data of ConfigMap
func (c *computeNodeConfigMapBuilder) SetBinaryData(binary map[string][]byte) ConfigMapBuilder {
if c.configmap.BinaryData == nil {
c.configmap.BinaryData = map[string][]byte{}
}
if val, ok := binary[ConfigDataKeyForServer]; ok {
c.configmap.BinaryData[ConfigDataKeyForServer] = val
}
if val, ok := binary[ConfigDataKeyForLogback]; ok {
c.configmap.BinaryData[ConfigDataKeyForLogback] = val
}
if val, ok := binary[ConfigDataKeyForAgent]; ok {
c.configmap.BinaryData[ConfigDataKeyForAgent] = val
}
return c
}
// Build builds the ConfigMap
func (c *computeNodeConfigMapBuilder) Build() *corev1.ConfigMap {
var (
cn *v1alpha1.ComputeNode
ok bool
)
if cn, ok = c.obj.(*v1alpha1.ComputeNode); !ok {
return nil
}
c.SetName(cn.Name).SetNamespace(cn.Namespace).SetLabels(cn.Labels).SetAnnotations(cn.Annotations)
data := map[string]string{}
logback := cn.Annotations[AnnoLogbackConfig]
if len(logback) > 0 {
data[ConfigDataKeyForLogback] = logback
} else {
data[ConfigDataKeyForLogback] = DefaultLogback
}
// NOTE: ShardingSphere Proxy 5.3.0 needs a server.yaml no matter if it is empty
if !reflect.DeepEqual(cn.Spec.Bootstrap.ServerConfig, v1alpha1.ServerConfig{}) {
servconf := cn.Spec.Bootstrap.ServerConfig.DeepCopy()
if y, err := yaml.Marshal(servconf); err == nil {
data[ConfigDataKeyForServer] = string(y)
}
} else {
data[ConfigDataKeyForServer] = DefaultServerConfig
}
// load java agent config to configmap if needed
if !reflect.DeepEqual(cn.Spec.Bootstrap.AgentConfig, v1alpha1.AgentConfig{}) {
agentConf := cn.Spec.Bootstrap.AgentConfig.DeepCopy()
if y, err := yaml.Marshal(agentConf); err == nil {
data[ConfigDataKeyForAgent] = string(y)
}
}
c.SetData(data)
return c.configmap
}
type shardingsphereChaosConfigMapBuilder struct {
configMapBuilder
obj runtime.Object
}
// SetData sets the data of ConfigMap
func (c *shardingsphereChaosConfigMapBuilder) SetData(data map[string]string) ConfigMapBuilder {
if c.configmap.Data == nil {
c.configmap.Data = map[string]string{}
}
if val, ok := data[configExperimental]; ok {
c.configmap.Data[configExperimental] = val
}
if val, ok := data[configVerify]; ok {
c.configmap.Data[configVerify] = val
}
if val, ok := data[configPressure]; ok {
c.configmap.Data[configPressure] = val
}
return c
}
// SetBinaryData sets the binary data of ConfigMap
func (c *shardingsphereChaosConfigMapBuilder) SetBinaryData(binary map[string][]byte) ConfigMapBuilder {
if c.configmap.BinaryData == nil {
c.configmap.BinaryData = map[string][]byte{}
}
if val, ok := binary[configExperimental]; ok {
c.configmap.BinaryData[configExperimental] = val
}
if val, ok := binary[configVerify]; ok {
c.configmap.BinaryData[configVerify] = val
}
if val, ok := binary[configPressure]; ok {
c.configmap.BinaryData[configPressure] = val
}
return c
}
// Build builds the ConfigMap
func (c *shardingsphereChaosConfigMapBuilder) Build() *corev1.ConfigMap {
var (
chaos *v1alpha1.Chaos
ok bool
)
if chaos, ok = c.obj.(*v1alpha1.Chaos); !ok {
return nil
}
c.SetName(chaos.Name).SetNamespace(chaos.Namespace).SetLabels(chaos.Labels).SetAnnotations(chaos.Annotations)
data := map[string]string{}
data[configExperimental] = string(chaos.Spec.InjectJob.Experimental)
data[configPressure] = string(chaos.Spec.InjectJob.Pressure)
data[configVerify] = string(chaos.Spec.InjectJob.Verify)
c.SetData(data)
return c.configmap
}
const (
configExperimental = "experimental.sh"
configPressure = "pressure.sh"
configVerify = "verify.sh"
)
const (
// DefaultConfigMapName is the data key name
DefaultConfigMapName = "ssChaos-configmap"
)
// UpdateConfigMap returns a new ConfigMap
func UpdateShardingSphereChaosConfigMap(ssChaos *v1alpha1.Chaos, cur *corev1.ConfigMap) *corev1.ConfigMap {
exp := &corev1.ConfigMap{}
exp.ObjectMeta = cur.ObjectMeta
exp.Labels = cur.Labels
exp.Annotations = cur.Annotations
now := NewConfigMap(ssChaos)
exp.Data = now.Data
return exp
}