Skip to content

Instantly share code, notes, and snippets.

@ian-howell
Created May 6, 2019 22:03
Show Gist options
  • Select an option

  • Save ian-howell/95d2676a2d802c79462a2ccb99fa2f75 to your computer and use it in GitHub Desktop.

Select an option

Save ian-howell/95d2676a2d802c79462a2ccb99fa2f75 to your computer and use it in GitHub Desktop.

Revisions

  1. ian-howell created this gist May 6, 2019.
    98 changes: 98 additions & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,98 @@
    package main

    import (
    "fmt"

    yaml "github.com/ghodss/yaml"
    v1 "k8s.io/api/core/v1"
    v1beta1 "k8s.io/api/extensions/v1beta1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    )

    type deployment struct {
    Name string
    PodSpec v1.PodSpec
    Replicas *int32
    }

    type pod struct {
    Name string
    Containers []container
    }

    type container struct {
    Image string
    Name string
    Command []string
    Args []string
    }

    func main() {
    mycontainer := container{
    Name: "alpine",
    Image: "alpine:3.7",
    Command: []string{"/bin/sleep", "9000"},
    }

    mypod := pod{Name: "alpine"}
    mypod.add(mycontainer)

    replicas := int32(3)
    mydeployment := deployment{
    Name: "alpine-deployment",
    Replicas: &replicas,
    }
    mydeployment.add(mypod)

    deploymentJSON, err := yaml.Marshal(createDeployment(mydeployment))
    if err != nil {
    fmt.Println(err)
    } else {
    fmt.Println(string(deploymentJSON))
    }
    }

    func createContainer(custom container) v1.Container {
    return v1.Container{
    Name: custom.Name,
    Image: custom.Image,
    Command: custom.Command,
    Args: custom.Args,
    }
    }

    func createPod(custom pod) v1.Pod {
    returnPod := v1.Pod{
    ObjectMeta: metav1.ObjectMeta{
    Name: custom.Name,
    CreationTimestamp: metav1.Now(),
    },
    }
    for _, container := range custom.Containers {
    returnPod.Spec.Containers = append(returnPod.Spec.Containers, createContainer(container))
    }
    return returnPod
    }

    func (p *pod) add(container container) {
    p.Containers = append(p.Containers, container)
    }

    func createDeployment(custom deployment) v1beta1.Deployment {
    returnDeployment := v1beta1.Deployment{
    ObjectMeta: metav1.ObjectMeta{
    Name: custom.Name,
    },
    Spec: v1beta1.DeploymentSpec{
    Replicas: custom.Replicas,
    Template: v1.PodTemplateSpec{
    Spec: custom.PodSpec,
    },
    },
    }
    return returnDeployment
    }

    func (d *deployment) add(pod pod) {
    d.PodSpec = createPod(pod).Spec
    }
    18 changes: 18 additions & 0 deletions output.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,18 @@
    metadata:
    creationTimestamp: null
    name: alpine-deployment
    spec:
    replicas: 3
    strategy: {}
    template:
    metadata:
    creationTimestamp: null
    spec:
    containers:
    - command:
    - /bin/sleep
    - "9000"
    image: alpine:3.7
    name: alpine
    resources: {}
    status: {}