diff --git a/cmd/drone-server/server.go b/cmd/drone-server/server.go index e811de2d2..0c4c72a5c 100644 --- a/cmd/drone-server/server.go +++ b/cmd/drone-server/server.go @@ -517,10 +517,24 @@ var flags = []cli.Flag{ Name: "kubernetes", Usage: "Kubernetes backend is enabled", }, + cli.StringFlag{ + EnvVar: "DRONE_KUBERNETES_NAMESPACE", + Name: "namespace", + Usage: "Kubernetes namespace to create resource in", + }, + cli.StringFlag{ + EnvVar: "DRONE_KUBERNETES_STORAGECLASS", + Name: "storageclass", + Usage: "Kubernetes storageclass to use for volumes", + }, + cli.StringFlag{ + EnvVar: "DRONE_KUBERNETES_VOLUME_SIZE", + Name: "volumesize", + Usage: "Size of the volume available for the pipeline", + }, } func server(c *cli.Context) error { - // debug level if requested by user if c.Bool("debug") { logrus.SetLevel(logrus.DebugLevel) @@ -601,7 +615,7 @@ func server(c *cli.Context) error { } log.Printf("pipeline: received next execution: %s", work.ID) - engine, err := kubernetes.New() + engine, err := kubernetes.New(c.String("namespace"), c.String("storageclass"), c.String("volumesize")) if err != nil { logrus.Error(err) return err diff --git a/cncd/pipeline/pipeline/backend/kubernetes/kubernetes.go b/cncd/pipeline/pipeline/backend/kubernetes/kubernetes.go index 8bdb38f61..59325598d 100644 --- a/cncd/pipeline/pipeline/backend/kubernetes/kubernetes.go +++ b/cncd/pipeline/pipeline/backend/kubernetes/kubernetes.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "io/ioutil" - "math/rand" "strings" "time" @@ -25,13 +24,15 @@ import ( ) type engine struct { - logs *bytes.Buffer - kubeClient kubernetes.Interface - namespace string + logs *bytes.Buffer + kubeClient kubernetes.Interface + namespace string + storageClass string + volumeSize string } // New returns a new Kubernetes Engine. -func New() (backend.Engine, error) { +func New(namespace1 string, storageClass1 string, size string) (backend.Engine, error) { var kubeClient kubernetes.Interface _, err := rest.InClusterConfig() if err != nil { @@ -45,9 +46,11 @@ func New() (backend.Engine, error) { } return &engine{ - logs: new(bytes.Buffer), - kubeClient: kubeClient, - namespace: "default", + logs: new(bytes.Buffer), + kubeClient: kubeClient, + namespace: namespace1, + storageClass: storageClass1, + volumeSize: size, }, nil } @@ -55,38 +58,9 @@ func New() (backend.Engine, error) { func (e *engine) Setup(ctx context.Context, conf *backend.Config) error { e.logs.WriteString("Setting up Kubernetes primitives\n") - // We don't need to create a PVC if no volumes are requested - if len(conf.Volumes) == 0 { - return nil - } - - nodeList, err := e.kubeClient.CoreV1().Nodes().List(metav1.ListOptions{}) - if err != nil { - return err - } - - var nodeNames []string - for _, n := range nodeList.Items { - nodeNames = append(nodeNames, n.Name) - } - - // Pick random node for now. - var node string - if len(nodeNames) == 1 { - node = nodeNames[0] - } else { - node = nodeNames[rand.Intn(len(nodeNames)-1)] - } - for _, vol := range conf.Volumes { - pv := PersistentVolume(node, e.namespace, vol.Name) - _, err := e.kubeClient.CoreV1().PersistentVolumes().Create(pv) - if err != nil { - return err - } - - pvc := PersistentVolumeClaim(e.namespace, vol.Name) - _, err = e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Create(pvc) + pvc := PersistentVolumeClaim(e.namespace, vol.Name, e.storageClass, e.volumeSize) + _, err := e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Create(pvc) if err != nil { return err } @@ -264,17 +238,11 @@ func (e *engine) Destroy(ctx context.Context, conf *backend.Config) error { } for _, vol := range conf.Volumes { - pvc := PersistentVolumeClaim(e.namespace, vol.Name) + pvc := PersistentVolumeClaim(e.namespace, vol.Name, e.storageClass, e.volumeSize) err := e.kubeClient.CoreV1().PersistentVolumeClaims(e.namespace).Delete(pvc.Name, deleteOpts) if err != nil { return err } - - pv := PersistentVolume("", e.namespace, vol.Name) - err = e.kubeClient.CoreV1().PersistentVolumes().Delete(pv.Name, deleteOpts) - if err != nil { - return err - } } return nil diff --git a/cncd/pipeline/pipeline/backend/kubernetes/volumes.go b/cncd/pipeline/pipeline/backend/kubernetes/volumes.go index 6db134c39..9dfeb3d5b 100644 --- a/cncd/pipeline/pipeline/backend/kubernetes/volumes.go +++ b/cncd/pipeline/pipeline/backend/kubernetes/volumes.go @@ -8,46 +8,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -var ( - volumeSize = resource.MustParse("1Gi") -) - -func PersistentVolume(node, namespace, name string) *v1.PersistentVolume { - return &v1.PersistentVolume{ - ObjectMeta: metav1.ObjectMeta{ - Name: volumeName(name), - Namespace: namespace, - }, - Spec: v1.PersistentVolumeSpec{ - Capacity: v1.ResourceList{ - v1.ResourceStorage: volumeSize, - }, - AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany}, - PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimRetain, - StorageClassName: "local-storage", - PersistentVolumeSource: v1.PersistentVolumeSource{ - Local: &v1.LocalVolumeSource{ - Path: "/tmp/drone", - }, - }, - NodeAffinity: &v1.VolumeNodeAffinity{ - Required: &v1.NodeSelector{ - NodeSelectorTerms: []v1.NodeSelectorTerm{{ - MatchExpressions: []v1.NodeSelectorRequirement{{ - Key: "kubernetes.io/hostname", - Operator: v1.NodeSelectorOpIn, - Values: []string{node}, - }}, - }}, - }, - }, - }, - } -} - -func PersistentVolumeClaim(namespace, name string) *v1.PersistentVolumeClaim { - localStorageClass := "local-storage" - +func PersistentVolumeClaim(namespace, name string, storageClass string, size string) *v1.PersistentVolumeClaim { return &v1.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{ Name: volumeName(name), @@ -55,10 +16,10 @@ func PersistentVolumeClaim(namespace, name string) *v1.PersistentVolumeClaim { }, Spec: v1.PersistentVolumeClaimSpec{ AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany}, - StorageClassName: &localStorageClass, + StorageClassName: &storageClass, Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - v1.ResourceStorage: volumeSize, + v1.ResourceStorage: resource.MustParse(size), }, }, },