package plugins import ( "fmt" "strings" "github.com/jenkinsci/kubernetes-operator/pkg/log" "github.com/pkg/errors" ) // Plugin represents jenkins plugin type Plugin struct { Name string `json:"name"` Version string `json:"version"` rootPluginNameAndVersion string } func (p Plugin) String() string { return fmt.Sprintf("%s:%s", p.Name, p.Version) } // New creates plugin from string, for example "name-of-plugin:0.0.1" func New(nameWithVersion string) (*Plugin, error) { val := strings.SplitN(nameWithVersion, ":", 2) if val == nil || len(val) != 2 { return nil, errors.Errorf("invalid plugin format '%s'", nameWithVersion) } return &Plugin{ Name: val[0], Version: val[1], }, nil } // Must returns plugin from pointer and throws panic when error is set func Must(plugin *Plugin, err error) Plugin { if err != nil { panic(err) } return *plugin } // VerifyDependencies checks if all plugins have compatible versions func VerifyDependencies(values ...map[Plugin][]Plugin) bool { // key - plugin name, value array of versions allPlugins := make(map[string][]Plugin) valid := true for _, value := range values { for rootPlugin, plugins := range value { allPlugins[rootPlugin.Name] = append(allPlugins[rootPlugin.Name], Plugin{ Name: rootPlugin.Name, Version: rootPlugin.Version, rootPluginNameAndVersion: rootPlugin.String()}) for _, plugin := range plugins { allPlugins[plugin.Name] = append(allPlugins[plugin.Name], Plugin{ Name: plugin.Name, Version: plugin.Version, rootPluginNameAndVersion: rootPlugin.String()}) } } } for pluginName, versions := range allPlugins { if len(versions) == 1 { continue } for _, firstVersion := range versions { for _, secondVersion := range versions { if firstVersion.Version != secondVersion.Version { log.Log.V(log.VWarn).Info(fmt.Sprintf("Plugin '%s' requires version '%s' but plugin '%s' requires '%s' for plugin '%s'", firstVersion.rootPluginNameAndVersion, firstVersion.Version, secondVersion.rootPluginNameAndVersion, secondVersion.Version, pluginName, )) valid = false } } } } return valid }