mirror of
https://github.com/jenkinsci/kubernetes-operator.git
synced 2026-09-30 05:01:10 +02:00
update to go 1.22 and operator-sdk 1.35 (#1094)
Co-authored-by: brokenpip3 <brokenpip3@gmail.com> Co-authored-by: Ansh Garhewal <me@anshdevs.in> Co-authored-by: xmbhasin <xmbhasin@users.noreply.github.com>
This commit is contained in:
co-authored by
brokenpip3
Ansh Garhewal
xmbhasin
parent
1ec83b9de9
commit
9c09db8031
@@ -21,7 +21,6 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
@@ -34,6 +33,7 @@ import (
|
||||
ctrl "sigs.k8s.io/controller-runtime"
|
||||
logf "sigs.k8s.io/controller-runtime/pkg/log"
|
||||
"sigs.k8s.io/controller-runtime/pkg/webhook"
|
||||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -44,11 +44,11 @@ var (
|
||||
)
|
||||
|
||||
const (
|
||||
Hosturl = "https://ci.jenkins.io/job/Infra/job/plugin-site-api/job/generate-data/lastSuccessfulBuild/artifact/plugins.json.gzip"
|
||||
CompressedFilePath = "/tmp/plugins.json.gzip"
|
||||
PluginDataFile = "/tmp/plugins.json"
|
||||
shortenedCheckingPeriod = 1 * time.Hour
|
||||
defaultCheckingPeriod = 12 * time.Minute
|
||||
Hosturl = "https://ci.jenkins.io/job/Infra/job/plugin-site-api/job/generate-data/lastSuccessfulBuild/artifact/plugins.json.gzip"
|
||||
PluginDataFileCompressedPath = "/tmp/plugins.json.gzip"
|
||||
PluginDataFile = "/tmp/plugins.json"
|
||||
shortenedCheckingPeriod = 1 * time.Hour
|
||||
defaultCheckingPeriod = 12 * time.Minute
|
||||
)
|
||||
|
||||
func (in *Jenkins) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
||||
@@ -58,30 +58,31 @@ func (in *Jenkins) SetupWebhookWithManager(mgr ctrl.Manager) error {
|
||||
}
|
||||
|
||||
// TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
|
||||
// +kubebuilder:webhook:path=/validate-jenkins-io-jenkins-io-v1alpha2-jenkins,mutating=false,failurePolicy=fail,sideEffects=None,groups=jenkins.io.jenkins.io,resources=jenkins,verbs=create;update,versions=v1alpha2,name=vjenkins.kb.io,admissionReviewVersions={v1,v1beta1}
|
||||
// +kubebuilder:webhook:path=/validate-jenkins-io-jenkins-io-v1alpha2-jenkins,mutating=false,failurePolicy=fail,sideEffects=None,groups=jenkins.io.jenkins.io,resources=jenkins,verbs=create;update,versions=v1alpha2,name=vjenkins.kb.io,admissionReviewVersions={v1}
|
||||
|
||||
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
|
||||
func (in *Jenkins) ValidateCreate() error {
|
||||
func (in *Jenkins) ValidateCreate() (admission.Warnings, error) {
|
||||
if in.Spec.ValidateSecurityWarnings {
|
||||
jenkinslog.Info("validate create", "name", in.Name)
|
||||
return Validate(*in)
|
||||
err := Validate(*in)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
|
||||
func (in *Jenkins) ValidateUpdate(old runtime.Object) error {
|
||||
func (in *Jenkins) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
|
||||
if in.Spec.ValidateSecurityWarnings {
|
||||
jenkinslog.Info("validate update", "name", in.Name)
|
||||
return Validate(*in)
|
||||
return nil, Validate(*in)
|
||||
}
|
||||
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (in *Jenkins) ValidateDelete() error {
|
||||
return nil
|
||||
func (in *Jenkins) ValidateDelete() (admission.Warnings, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
type SecurityValidator struct {
|
||||
@@ -263,11 +264,17 @@ func (in *SecurityValidator) fetchPluginData() error {
|
||||
}
|
||||
|
||||
func (in *SecurityValidator) download() error {
|
||||
out, err := os.Create(CompressedFilePath)
|
||||
pluginDataFileCompressed, err := os.Create(PluginDataFileCompressedPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
// ensure pluginDataFileCompressed is closed
|
||||
defer func() {
|
||||
if err := pluginDataFileCompressed.Close(); err != nil {
|
||||
jenkinslog.V(log.VDebug).Info("Failed to close SecurityValidator.download io", "error", err)
|
||||
}
|
||||
}()
|
||||
|
||||
req, err := http.NewRequest(http.MethodGet, Hosturl, nil)
|
||||
if err != nil {
|
||||
@@ -284,30 +291,45 @@ func (in *SecurityValidator) download() error {
|
||||
return err
|
||||
}
|
||||
|
||||
defer response.Body.Close()
|
||||
defer httpResponseCloser(response)
|
||||
|
||||
_, err = io.Copy(pluginDataFileCompressed, response.Body)
|
||||
|
||||
_, err = io.Copy(out, response.Body)
|
||||
return err
|
||||
}
|
||||
|
||||
func (in *SecurityValidator) extract() error {
|
||||
reader, err := os.Open(CompressedFilePath)
|
||||
reader, err := os.Open(PluginDataFileCompressedPath)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer reader.Close()
|
||||
defer func() {
|
||||
if err := reader.Close(); err != nil {
|
||||
log.Log.Error(err, "failed to close SecurityValidator.extract.reader ")
|
||||
}
|
||||
}()
|
||||
|
||||
archive, err := gzip.NewReader(reader)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer archive.Close()
|
||||
defer func() {
|
||||
if err := archive.Close(); err != nil {
|
||||
log.Log.Error(err, "failed to close SecurityValidator.extract.archive ")
|
||||
}
|
||||
}()
|
||||
writer, err := os.Create(PluginDataFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer writer.Close()
|
||||
|
||||
defer func() {
|
||||
if err := writer.Close(); err != nil {
|
||||
log.Log.Error(err, "failed to close SecurityValidator.extract.writer")
|
||||
}
|
||||
}()
|
||||
|
||||
_, err = io.Copy(writer, archive)
|
||||
return err
|
||||
@@ -319,8 +341,12 @@ func (in *SecurityValidator) cache() error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer jsonFile.Close()
|
||||
byteValue, err := ioutil.ReadAll(jsonFile)
|
||||
defer func() {
|
||||
if err := jsonFile.Close(); err != nil {
|
||||
log.Log.Error(err, "failed to close SecurityValidator.cache.jsonFile")
|
||||
}
|
||||
}()
|
||||
byteValue, err := io.ReadAll(jsonFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -346,3 +372,9 @@ func compareVersions(firstVersion string, lastVersion string, pluginVersion stri
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func httpResponseCloser(response *http.Response) {
|
||||
if err := response.Body.Close(); err != nil {
|
||||
log.Log.Error(err, "failed to close http response body")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ func TestValidate(t *testing.T) {
|
||||
t.Run("Validating when plugins data file is not fetched", func(t *testing.T) {
|
||||
userplugins := []Plugin{{Name: "script-security", Version: "1.77"}, {Name: "git-client", Version: "3.9"}, {Name: "git", Version: "4.8.1"}, {Name: "plain-credentials", Version: "1.7"}}
|
||||
jenkinscr := *createJenkinsCR(userplugins, true)
|
||||
got := jenkinscr.ValidateCreate()
|
||||
_, got := jenkinscr.ValidateCreate()
|
||||
assert.Equal(t, got, errors.New("plugins data has not been fetched"))
|
||||
})
|
||||
|
||||
@@ -95,7 +95,7 @@ func TestValidate(t *testing.T) {
|
||||
{Name: "plain-credentials"}}}
|
||||
userplugins := []Plugin{{Name: "script-security", Version: "1.77"}, {Name: "git-client", Version: "3.9"}, {Name: "git", Version: "4.8.1"}, {Name: "plain-credentials", Version: "1.7"}}
|
||||
jenkinscr := *createJenkinsCR(userplugins, true)
|
||||
got := jenkinscr.ValidateCreate()
|
||||
_, got := jenkinscr.ValidateCreate()
|
||||
assert.Nil(t, got)
|
||||
})
|
||||
|
||||
@@ -113,7 +113,7 @@ func TestValidate(t *testing.T) {
|
||||
}}
|
||||
userplugins := []Plugin{{Name: "google-login", Version: "1.2"}, {Name: "mailer", Version: "1.1"}, {Name: "git", Version: "4.8.1"}, {Name: "command-launcher", Version: "1.6"}, {Name: "workflow-cps", Version: "2.59"}}
|
||||
jenkinscr := *createJenkinsCR(userplugins, true)
|
||||
got := jenkinscr.ValidateCreate()
|
||||
_, got := jenkinscr.ValidateCreate()
|
||||
assert.Equal(t, got, errors.New("security vulnerabilities detected in the following user-defined plugins: \nworkflow-cps:2.59\ngoogle-login:1.2\nmailer:1.1"))
|
||||
})
|
||||
|
||||
@@ -136,19 +136,19 @@ func TestValidate(t *testing.T) {
|
||||
|
||||
userplugins = []Plugin{{Name: "handy-uri-templates-2-api", Version: "2.1.8-1.0"}, {Name: "resource-disposer", Version: "0.8"}, {Name: "jjwt-api", Version: "0.11.2-9.c8b45b8bb173"}, {Name: "blueocean-github-pipeline", Version: "1.2.0-beta-3"}, {Name: "ghprb", Version: "1.39"}}
|
||||
newjenkinscr := *createJenkinsCR(userplugins, true)
|
||||
got := newjenkinscr.ValidateUpdate(&oldjenkinscr)
|
||||
_, got := newjenkinscr.ValidateUpdate(&oldjenkinscr)
|
||||
assert.Equal(t, got, errors.New("security vulnerabilities detected in the following user-defined plugins: \nhandy-uri-templates-2-api:2.1.8-1.0\nresource-disposer:0.8\nblueocean-github-pipeline:1.2.0-beta-3\nghprb:1.39"))
|
||||
})
|
||||
|
||||
t.Run("Validation is turned off", func(t *testing.T) {
|
||||
userplugins := []Plugin{{Name: "google-login", Version: "1.2"}, {Name: "mailer", Version: "1.1"}, {Name: "git", Version: "4.8.1"}, {Name: "command-launcher", Version: "1.6"}, {Name: "workflow-cps", Version: "2.59"}}
|
||||
jenkinscr := *createJenkinsCR(userplugins, false)
|
||||
got := jenkinscr.ValidateCreate()
|
||||
_, got := jenkinscr.ValidateCreate()
|
||||
assert.Nil(t, got)
|
||||
|
||||
userplugins = []Plugin{{Name: "google-login", Version: "1.2"}, {Name: "mailer", Version: "1.1"}, {Name: "git", Version: "4.8.1"}, {Name: "command-launcher", Version: "1.6"}, {Name: "workflow-cps", Version: "2.59"}}
|
||||
newjenkinscr := *createJenkinsCR(userplugins, false)
|
||||
got = newjenkinscr.ValidateUpdate(&jenkinscr)
|
||||
_, got = newjenkinscr.ValidateUpdate(&jenkinscr)
|
||||
assert.Nil(t, got)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// +build !ignore_autogenerated
|
||||
//go:build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright 2021.
|
||||
|
||||
Reference in New Issue
Block a user