Creating a Job with Kubernetes client-go

5/24/2018

Currently I have a piece of go code that is based on other examples. I can list all the pods, jobs... etc but I am encountering a rather tricky problem with the creation of a Job on Openshift.

The following parts of my code are supposed to create a Job, I even get a response, but no job is being created on the mentioned namespace:

func main() {
    var kubeconfig *string
    if home := homedir.HomeDir(); home != "" {
        kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
    } else {
        kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
    }
    flag.Parse()
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err)
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err)
    }
    jobsClient := clientset.BatchV1().Jobs("gitlab")
    job := &batchv1.Job{
        ObjectMeta: metav1.ObjectMeta{
            Name: "demo-job",
        },
        Spec: batchv1.JobSpec{
            Template: apiv1.PodTemplateSpec{
                Spec: apiv1.PodSpec{
                    Containers: []apiv1.Container{
                        {
                            Name:  "demo",
                            Image: "myimage",
                        },
                    },
                },
            },
        },
    }

    fmt.Println("Creating job... ")
    result1, err1 := jobsClient.Create(job)
    if err != nil {
        fmt.Println(err1)
        panic(err1)
    }
    fmt.Printf("Created job %q.\n", result1)

}

As a result, all I get is this:

Created job "&Job{ObjectMeta:k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta{Name:,GenerateName:,Namespace:,SelfLink:,UID:,ResourceVersion:,Generation:0,CreationTimestamp:0001-01-01 00:00:00 +0000 UTC,DeletionTimestamp:<nil>,DeletionGracePeriodSeconds:nil,Labels:map[string]string{},Annotations:map[string]string{},OwnerReferences:[],Finalizers:[],ClusterName:,Initializers:nil,},Spec:JobSpec{Parallelism:nil,Completions:nil,ActiveDeadlineSeconds:nil,Selector:nil,ManualSelector:nil,Template:k8s_io_api_core_v1.PodTemplateSpec{ObjectMeta:k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta{Name:,GenerateName:,Namespace:,SelfLink:,UID:,ResourceVersion:,Generation:0,CreationTimestamp:0001-01-01 00:00:00 +0000 UTC,DeletionTimestamp:<nil>,DeletionGracePeriodSeconds:nil,Labels:map[string]string{},Annotations:map[string]string{},OwnerReferences:[],Finalizers:[],ClusterName:,Initializers:nil,},Spec:PodSpec{Volumes:[],Containers:[],RestartPolicy:,TerminationGracePeriodSeconds:nil,ActiveDeadlineSeconds:nil,DNSPolicy:,NodeSelector:map[string]string{},ServiceAccountName:,DeprecatedServiceAccount:,NodeName:,HostNetwork:false,HostPID:false,HostIPC:false,SecurityContext:nil,ImagePullSecrets:[],Hostname:,Subdomain:,Affinity:nil,SchedulerName:,InitContainers:[],AutomountServiceAccountToken:nil,Tolerations:[],HostAliases:[],PriorityClassName:,Priority:nil,DNSConfig:nil,},},BackoffLimit:nil,},Status:JobStatus{Conditions:[],StartTime:<nil>,CompletionTime:<nil>,Active:0,Succeeded:0,Failed:0,},}".

Checking on the "gitlab" namespace and there is no new job.

-- djuarez
go
kubernetes
openshift

2 Answers

5/25/2018

Based on the work that I did in the past (you can see here), I think you can specify the Namespace in the ObjectMeta of the Job resource. And you can drop it in the jobsClient.

jobsClient := clientset.BatchV1().Jobs()
job := &batchv1.Job{
    ObjectMeta: metav1.ObjectMeta{
        Name: "demo-job",
        Namespace: "gitlab",
    },
    Spec: batchv1.JobSpec{
        Template: apiv1.PodTemplateSpec{
            Spec: apiv1.PodSpec{
                Containers: []apiv1.Container{
                    {
                        Name:  "demo",
                        Image: "myimage",
                    },
                },
            },
        },
    },
}
-- leodotcloud
Source: StackOverflow

5/25/2018

Figured it out, even if you do not get any error you have to specify all the required fields, so take the job result and see if you can manually create the object.

Having said that, the previous Job needs to be created as it follows:

job := &batchv1.Job{
        ObjectMeta: metav1.ObjectMeta{
            GenerateName: "prometheus-webhook-",
            Namespace: "gitlab",
        },
        Spec: batchv1.JobSpec{
            Template: apiv1.PodTemplateSpec{
                ObjectMeta: metav1.ObjectMeta{
                    GenerateName: "prometheus-webhook-",
                },
                Spec: apiv1.PodSpec{
                    Containers: []apiv1.Container{
                        {
                            Name:  "ansible-job",
                            Image: "yourimage",
                        },
                    },
                    RestartPolicy: apiv1.RestartPolicyOnFailure,
                },
            },
        },
    }    
-- djuarez
Source: StackOverflow