#1 Split plugins in two groups:required by operator and required by user

This commit is contained in:
Tomasz Sęk
2019-02-16 20:29:59 +01:00
parent dd04c0cf5b
commit 08b6dfb691
13 changed files with 349 additions and 250 deletions
@@ -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)
})
}
}