mirror of
https://github.com/jenkinsci/kubernetes-operator.git
synced 2026-10-18 23:40:31 +02:00
#1 Split plugins in two groups:required by operator and required by user
This commit is contained in:
@@ -85,12 +85,13 @@ func (r *ReconcileJenkinsBaseConfiguration) Reconcile() (reconcile.Result, jenki
|
||||
}
|
||||
r.logger.V(log.VDebug).Info("Jenkins API client set")
|
||||
|
||||
ok, err := r.verifyPlugins(jenkinsClient, plugins.BasePluginsMap)
|
||||
ok, err := r.verifyPlugins(jenkinsClient)
|
||||
if err != nil {
|
||||
return reconcile.Result{}, nil, err
|
||||
}
|
||||
if !ok {
|
||||
r.logger.V(log.VWarn).Info("Please correct Jenkins CR (spec.master.plugins)")
|
||||
r.logger.V(log.VWarn).Info("Please correct Jenkins CR(spec.master.OperatorPlugins or spec.master.plugins)")
|
||||
// TODO inform user via Admin Monitor and don't restart Jenkins
|
||||
return reconcile.Result{Requeue: true}, nil, r.restartJenkinsMasterPod(metaObject)
|
||||
}
|
||||
|
||||
@@ -137,7 +138,7 @@ func (r *ReconcileJenkinsBaseConfiguration) ensureResourcesRequiredForJenkinsPod
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *ReconcileJenkinsBaseConfiguration) verifyPlugins(jenkinsClient jenkinsclient.Jenkins, allRequiredPlugins ...map[string][]plugins.Plugin) (bool, error) {
|
||||
func (r *ReconcileJenkinsBaseConfiguration) verifyPlugins(jenkinsClient jenkinsclient.Jenkins) (bool, error) {
|
||||
allPluginsInJenkins, err := jenkinsClient.GetPlugins(fetchAllPlugins)
|
||||
if err != nil {
|
||||
return false, err
|
||||
@@ -151,7 +152,21 @@ func (r *ReconcileJenkinsBaseConfiguration) verifyPlugins(jenkinsClient jenkinsc
|
||||
}
|
||||
r.logger.V(log.VDebug).Info(fmt.Sprintf("Installed plugins '%+v'", installedPlugins))
|
||||
|
||||
userPlugins := map[string][]plugins.Plugin{}
|
||||
for rootPlugin, dependentPluginNames := range r.jenkins.Spec.Master.Plugins {
|
||||
var dependentPlugins []plugins.Plugin
|
||||
for _, pluginNameWithVersion := range dependentPluginNames {
|
||||
plugin, err := plugins.New(pluginNameWithVersion)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
dependentPlugins = append(dependentPlugins, *plugin)
|
||||
}
|
||||
userPlugins[rootPlugin] = dependentPlugins
|
||||
}
|
||||
|
||||
status := true
|
||||
allRequiredPlugins := []map[string][]plugins.Plugin{plugins.BasePluginsMap, userPlugins}
|
||||
for _, requiredPlugins := range allRequiredPlugins {
|
||||
for rootPluginName, p := range requiredPlugins {
|
||||
rootPlugin, _ := plugins.New(rootPluginName)
|
||||
|
||||
@@ -254,12 +254,19 @@ chmod +x {{ .JenkinsHomePath }}/scripts/*.sh
|
||||
{{- $jenkinsHomePath := .JenkinsHomePath }}
|
||||
{{- $installPluginsCommand := .InstallPluginsCommand }}
|
||||
|
||||
echo "Installing plugins - begin"
|
||||
{{- range $rootPluginName, $plugins := .Plugins }}
|
||||
echo "Installing plugins required by Operator - begin"
|
||||
{{- range $rootPluginName, $plugins := .OperatorPlugins }}
|
||||
echo "Installing required plugins for '{{ $rootPluginName }}'"
|
||||
{{ $jenkinsHomePath }}/scripts/{{ $installPluginsCommand }} {{ $rootPluginName }} {{ range $index, $plugin := $plugins }}{{ . }} {{ end }}
|
||||
{{- end }}
|
||||
echo "Installing plugins - end"
|
||||
echo "Installing plugins required by Operator - end"
|
||||
|
||||
echo "Installing plugins required by user - begin"
|
||||
{{- range $rootPluginName, $plugins := .UserPlugins }}
|
||||
echo "Installing required plugins for '{{ $rootPluginName }}'"
|
||||
{{ $jenkinsHomePath }}/scripts/{{ $installPluginsCommand }} {{ $rootPluginName }} {{ range $index, $plugin := $plugins }}{{ . }} {{ end }}
|
||||
{{- end }}
|
||||
echo "Installing plugins required by user - end"
|
||||
|
||||
/sbin/tini -s -- /usr/local/bin/jenkins.sh
|
||||
`))
|
||||
@@ -271,17 +278,19 @@ func buildConfigMapTypeMeta() metav1.TypeMeta {
|
||||
}
|
||||
}
|
||||
|
||||
func buildInitBashScript(pluginsToInstall map[string][]string) (*string, error) {
|
||||
func buildInitBashScript(jenkins *v1alpha1.Jenkins) (*string, error) {
|
||||
data := struct {
|
||||
JenkinsHomePath string
|
||||
InitConfigurationPath string
|
||||
InstallPluginsCommand string
|
||||
JenkinsScriptsVolumePath string
|
||||
Plugins map[string][]string
|
||||
OperatorPlugins map[string][]string
|
||||
UserPlugins map[string][]string
|
||||
}{
|
||||
JenkinsHomePath: jenkinsHomePath,
|
||||
InitConfigurationPath: jenkinsInitConfigurationVolumePath,
|
||||
Plugins: pluginsToInstall,
|
||||
OperatorPlugins: jenkins.Spec.Master.OperatorPlugins,
|
||||
UserPlugins: jenkins.Spec.Master.Plugins,
|
||||
InstallPluginsCommand: installPluginsCommand,
|
||||
JenkinsScriptsVolumePath: jenkinsScriptsVolumePath,
|
||||
}
|
||||
@@ -302,7 +311,7 @@ func getScriptsConfigMapName(jenkins *v1alpha1.Jenkins) string {
|
||||
func NewScriptsConfigMap(meta metav1.ObjectMeta, jenkins *v1alpha1.Jenkins) (*corev1.ConfigMap, error) {
|
||||
meta.Name = getScriptsConfigMapName(jenkins)
|
||||
|
||||
initBashScript, err := buildInitBashScript(jenkins.Spec.Master.Plugins)
|
||||
initBashScript, err := buildInitBashScript(jenkins)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -28,34 +28,39 @@ func (r *ReconcileJenkinsBaseConfiguration) Validate(jenkins *v1alpha1.Jenkins)
|
||||
|
||||
}
|
||||
|
||||
if !r.validatePlugins(jenkins.Spec.Master.Plugins) {
|
||||
if !r.validatePlugins(jenkins.Spec.Master.OperatorPlugins, jenkins.Spec.Master.Plugins) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (r *ReconcileJenkinsBaseConfiguration) validatePlugins(pluginsWithVersions map[string][]string) bool {
|
||||
func (r *ReconcileJenkinsBaseConfiguration) validatePlugins(pluginsWithVersionSlice ...map[string][]string) bool {
|
||||
valid := true
|
||||
allPlugins := map[string][]plugins.Plugin{}
|
||||
allPlugins := map[plugins.Plugin][]plugins.Plugin{}
|
||||
|
||||
for rootPluginName, dependentPluginNames := range pluginsWithVersions {
|
||||
if _, err := plugins.New(rootPluginName); err != nil {
|
||||
r.logger.V(log.VWarn).Info(fmt.Sprintf("Invalid root plugin name '%s'", rootPluginName))
|
||||
valid = false
|
||||
}
|
||||
|
||||
dependentPlugins := []plugins.Plugin{}
|
||||
for _, pluginName := range dependentPluginNames {
|
||||
if p, err := plugins.New(pluginName); err != nil {
|
||||
r.logger.V(log.VWarn).Info(fmt.Sprintf("Invalid dependent plugin name '%s' in root plugin '%s'", pluginName, rootPluginName))
|
||||
for _, pluginsWithVersions := range pluginsWithVersionSlice {
|
||||
for rootPluginName, dependentPluginNames := range pluginsWithVersions {
|
||||
rootPlugin, err := plugins.New(rootPluginName)
|
||||
if err != nil {
|
||||
r.logger.V(log.VWarn).Info(fmt.Sprintf("Invalid root plugin name '%s'", rootPluginName))
|
||||
valid = false
|
||||
} else {
|
||||
dependentPlugins = append(dependentPlugins, *p)
|
||||
}
|
||||
|
||||
var dependentPlugins []plugins.Plugin
|
||||
for _, pluginName := range dependentPluginNames {
|
||||
if p, err := plugins.New(pluginName); err != nil {
|
||||
r.logger.V(log.VWarn).Info(fmt.Sprintf("Invalid dependent plugin name '%s' in root plugin '%s'", pluginName, rootPluginName))
|
||||
valid = false
|
||||
} else {
|
||||
dependentPlugins = append(dependentPlugins, *p)
|
||||
}
|
||||
}
|
||||
|
||||
if rootPlugin != nil {
|
||||
allPlugins[*rootPlugin] = dependentPlugins
|
||||
}
|
||||
}
|
||||
|
||||
allPlugins[rootPluginName] = dependentPlugins
|
||||
}
|
||||
|
||||
if valid {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package base
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -9,50 +8,60 @@ import (
|
||||
)
|
||||
|
||||
func TestValidatePlugins(t *testing.T) {
|
||||
data := []struct {
|
||||
plugins map[string][]string
|
||||
expectedResult bool
|
||||
}{
|
||||
{
|
||||
plugins: map[string][]string{
|
||||
"valid-plugin-name:1.0": {
|
||||
"valid-plugin-name:1.0",
|
||||
},
|
||||
},
|
||||
expectedResult: true,
|
||||
},
|
||||
{
|
||||
plugins: map[string][]string{
|
||||
"invalid-plugin-name": {
|
||||
"invalid-plugin-name",
|
||||
},
|
||||
},
|
||||
expectedResult: false,
|
||||
},
|
||||
{
|
||||
plugins: map[string][]string{
|
||||
"valid-plugin-name:1.0": {
|
||||
"valid-plugin-name:1.0",
|
||||
"valid-plugin-name2:1.0",
|
||||
},
|
||||
},
|
||||
expectedResult: true,
|
||||
},
|
||||
{
|
||||
plugins: map[string][]string{
|
||||
"valid-plugin-name:1.0": {},
|
||||
},
|
||||
expectedResult: true,
|
||||
},
|
||||
}
|
||||
|
||||
baseReconcileLoop := New(nil, nil, logf.ZapLogger(false),
|
||||
nil, false, false)
|
||||
t.Run("happy", func(t *testing.T) {
|
||||
plugins := map[string][]string{
|
||||
"valid-plugin-name:1.0": {
|
||||
"valid-plugin-name:1.0",
|
||||
},
|
||||
}
|
||||
got := baseReconcileLoop.validatePlugins(plugins)
|
||||
assert.Equal(t, true, got)
|
||||
})
|
||||
t.Run("fail, no version in plugin name", func(t *testing.T) {
|
||||
plugins := map[string][]string{
|
||||
"invalid-plugin-name": {
|
||||
"invalid-plugin-name",
|
||||
},
|
||||
}
|
||||
got := baseReconcileLoop.validatePlugins(plugins)
|
||||
assert.Equal(t, false, got)
|
||||
})
|
||||
t.Run("fail, no version in root plugin name", func(t *testing.T) {
|
||||
plugins := map[string][]string{
|
||||
"invalid-plugin-name": {
|
||||
"invalid-plugin-name:1.0",
|
||||
},
|
||||
}
|
||||
got := baseReconcileLoop.validatePlugins(plugins)
|
||||
assert.Equal(t, false, got)
|
||||
})
|
||||
t.Run("fail, no version in plugin name", func(t *testing.T) {
|
||||
plugins := map[string][]string{
|
||||
"invalid-plugin-name:1.0": {
|
||||
"invalid-plugin-name",
|
||||
},
|
||||
}
|
||||
got := baseReconcileLoop.validatePlugins(plugins)
|
||||
assert.Equal(t, false, got)
|
||||
})
|
||||
t.Run("happy", func(t *testing.T) {
|
||||
plugins := map[string][]string{
|
||||
"valid-plugin-name:1.0": {
|
||||
"valid-plugin-name:1.0",
|
||||
"valid-plugin-name2:1.0",
|
||||
},
|
||||
}
|
||||
got := baseReconcileLoop.validatePlugins(plugins)
|
||||
assert.Equal(t, true, got)
|
||||
})
|
||||
t.Run("hapy", func(t *testing.T) {
|
||||
plugins := map[string][]string{
|
||||
"valid-plugin-name:1.0": {},
|
||||
}
|
||||
got := baseReconcileLoop.validatePlugins(plugins)
|
||||
assert.Equal(t, true, got)
|
||||
})
|
||||
|
||||
for index, testingData := range data {
|
||||
t.Run(fmt.Sprintf("Testing %d plugins set", index), func(t *testing.T) {
|
||||
result := baseReconcileLoop.validatePlugins(testingData.plugins)
|
||||
assert.Equal(t, testingData.expectedResult, result)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user