123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995 |
- /*
- Copyright 2014 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package kubectl
- import (
- "fmt"
- "strconv"
- "strings"
- "k8s.io/kubernetes/pkg/api"
- "k8s.io/kubernetes/pkg/api/resource"
- "k8s.io/kubernetes/pkg/api/unversioned"
- "k8s.io/kubernetes/pkg/api/v1"
- "k8s.io/kubernetes/pkg/apis/batch"
- batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1"
- batchv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1"
- "k8s.io/kubernetes/pkg/apis/extensions"
- "k8s.io/kubernetes/pkg/runtime"
- "k8s.io/kubernetes/pkg/util/validation"
- )
- type DeploymentV1Beta1 struct{}
- func (DeploymentV1Beta1) ParamNames() []GeneratorParam {
- return []GeneratorParam{
- {"labels", false},
- {"default-name", false},
- {"name", true},
- {"replicas", true},
- {"image", true},
- {"image-pull-policy", false},
- {"port", false},
- {"hostport", false},
- {"stdin", false},
- {"tty", false},
- {"command", false},
- {"args", false},
- {"env", false},
- {"requests", false},
- {"limits", false},
- }
- }
- func (DeploymentV1Beta1) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
- args, err := getArgs(genericParams)
- if err != nil {
- return nil, err
- }
- envs, err := getEnvs(genericParams)
- if err != nil {
- return nil, err
- }
- params, err := getParams(genericParams)
- if err != nil {
- return nil, err
- }
- name, err := getName(params)
- if err != nil {
- return nil, err
- }
- labels, err := getLabels(params, true, name)
- if err != nil {
- return nil, err
- }
- count, err := strconv.Atoi(params["replicas"])
- if err != nil {
- return nil, err
- }
- podSpec, err := makePodSpec(params, name)
- if err != nil {
- return nil, err
- }
- imagePullPolicy := api.PullPolicy(params["image-pull-policy"])
- if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil {
- return nil, err
- }
- if err := updatePodPorts(params, podSpec); err != nil {
- return nil, err
- }
- // TODO: use versioned types for generators so that we don't need to
- // set default values manually (see issue #17384)
- deployment := extensions.Deployment{
- ObjectMeta: api.ObjectMeta{
- Name: name,
- Labels: labels,
- },
- Spec: extensions.DeploymentSpec{
- Replicas: int32(count),
- Selector: &unversioned.LabelSelector{MatchLabels: labels},
- Template: api.PodTemplateSpec{
- ObjectMeta: api.ObjectMeta{
- Labels: labels,
- },
- Spec: *podSpec,
- },
- },
- }
- return &deployment, nil
- }
- func getLabels(params map[string]string, defaultRunLabel bool, name string) (map[string]string, error) {
- labelString, found := params["labels"]
- var labels map[string]string
- var err error
- if found && len(labelString) > 0 {
- labels, err = ParseLabels(labelString)
- if err != nil {
- return nil, err
- }
- } else if defaultRunLabel {
- labels = map[string]string{
- "run": name,
- }
- }
- return labels, nil
- }
- func getName(params map[string]string) (string, error) {
- name, found := params["name"]
- if !found || len(name) == 0 {
- name, found = params["default-name"]
- if !found || len(name) == 0 {
- return "", fmt.Errorf("'name' is a required parameter.")
- }
- }
- return name, nil
- }
- func getParams(genericParams map[string]interface{}) (map[string]string, error) {
- params := map[string]string{}
- for key, value := range genericParams {
- strVal, isString := value.(string)
- if !isString {
- return nil, fmt.Errorf("expected string, saw %v for '%s'", value, key)
- }
- params[key] = strVal
- }
- return params, nil
- }
- func getArgs(genericParams map[string]interface{}) ([]string, error) {
- args := []string{}
- val, found := genericParams["args"]
- if found {
- var isArray bool
- args, isArray = val.([]string)
- if !isArray {
- return nil, fmt.Errorf("expected []string, found: %v", val)
- }
- delete(genericParams, "args")
- }
- return args, nil
- }
- func getEnvs(genericParams map[string]interface{}) ([]api.EnvVar, error) {
- var envs []api.EnvVar
- envStrings, found := genericParams["env"]
- if found {
- if envStringArray, isArray := envStrings.([]string); isArray {
- var err error
- envs, err = parseEnvs(envStringArray)
- if err != nil {
- return nil, err
- }
- delete(genericParams, "env")
- } else {
- return nil, fmt.Errorf("expected []string, found: %v", envStrings)
- }
- }
- return envs, nil
- }
- func getV1Envs(genericParams map[string]interface{}) ([]v1.EnvVar, error) {
- var envs []v1.EnvVar
- envStrings, found := genericParams["env"]
- if found {
- if envStringArray, isArray := envStrings.([]string); isArray {
- var err error
- envs, err = parseV1Envs(envStringArray)
- if err != nil {
- return nil, err
- }
- delete(genericParams, "env")
- } else {
- return nil, fmt.Errorf("expected []string, found: %v", envStrings)
- }
- }
- return envs, nil
- }
- type JobV1Beta1 struct{}
- func (JobV1Beta1) ParamNames() []GeneratorParam {
- return []GeneratorParam{
- {"labels", false},
- {"default-name", false},
- {"name", true},
- {"image", true},
- {"image-pull-policy", false},
- {"port", false},
- {"hostport", false},
- {"stdin", false},
- {"leave-stdin-open", false},
- {"tty", false},
- {"command", false},
- {"args", false},
- {"env", false},
- {"requests", false},
- {"limits", false},
- {"restart", false},
- }
- }
- func (JobV1Beta1) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
- args, err := getArgs(genericParams)
- if err != nil {
- return nil, err
- }
- envs, err := getEnvs(genericParams)
- if err != nil {
- return nil, err
- }
- params, err := getParams(genericParams)
- if err != nil {
- return nil, err
- }
- name, err := getName(params)
- if err != nil {
- return nil, err
- }
- labels, err := getLabels(params, true, name)
- if err != nil {
- return nil, err
- }
- podSpec, err := makePodSpec(params, name)
- if err != nil {
- return nil, err
- }
- imagePullPolicy := api.PullPolicy(params["image-pull-policy"])
- if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil {
- return nil, err
- }
- leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false)
- if err != nil {
- return nil, err
- }
- podSpec.Containers[0].StdinOnce = !leaveStdinOpen && podSpec.Containers[0].Stdin
- if err := updatePodPorts(params, podSpec); err != nil {
- return nil, err
- }
- restartPolicy := api.RestartPolicy(params["restart"])
- if len(restartPolicy) == 0 {
- restartPolicy = api.RestartPolicyNever
- }
- podSpec.RestartPolicy = restartPolicy
- job := batch.Job{
- ObjectMeta: api.ObjectMeta{
- Name: name,
- Labels: labels,
- },
- Spec: batch.JobSpec{
- Selector: &unversioned.LabelSelector{
- MatchLabels: labels,
- },
- ManualSelector: newBool(true),
- Template: api.PodTemplateSpec{
- ObjectMeta: api.ObjectMeta{
- Labels: labels,
- },
- Spec: *podSpec,
- },
- },
- }
- return &job, nil
- }
- type JobV1 struct{}
- func (JobV1) ParamNames() []GeneratorParam {
- return []GeneratorParam{
- {"labels", false},
- {"default-name", false},
- {"name", true},
- {"image", true},
- {"image-pull-policy", false},
- {"port", false},
- {"hostport", false},
- {"stdin", false},
- {"leave-stdin-open", false},
- {"tty", false},
- {"command", false},
- {"args", false},
- {"env", false},
- {"requests", false},
- {"limits", false},
- {"restart", false},
- }
- }
- func (JobV1) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
- args, err := getArgs(genericParams)
- if err != nil {
- return nil, err
- }
- envs, err := getV1Envs(genericParams)
- if err != nil {
- return nil, err
- }
- params, err := getParams(genericParams)
- if err != nil {
- return nil, err
- }
- name, err := getName(params)
- if err != nil {
- return nil, err
- }
- labels, err := getLabels(params, true, name)
- if err != nil {
- return nil, err
- }
- podSpec, err := makeV1PodSpec(params, name)
- if err != nil {
- return nil, err
- }
- imagePullPolicy := v1.PullPolicy(params["image-pull-policy"])
- if err = updateV1PodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil {
- return nil, err
- }
- leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false)
- if err != nil {
- return nil, err
- }
- podSpec.Containers[0].StdinOnce = !leaveStdinOpen && podSpec.Containers[0].Stdin
- if err := updateV1PodPorts(params, podSpec); err != nil {
- return nil, err
- }
- restartPolicy := v1.RestartPolicy(params["restart"])
- if len(restartPolicy) == 0 {
- restartPolicy = v1.RestartPolicyNever
- }
- podSpec.RestartPolicy = restartPolicy
- job := batchv1.Job{
- ObjectMeta: v1.ObjectMeta{
- Name: name,
- Labels: labels,
- },
- Spec: batchv1.JobSpec{
- Template: v1.PodTemplateSpec{
- ObjectMeta: v1.ObjectMeta{
- Labels: labels,
- },
- Spec: *podSpec,
- },
- },
- }
- return &job, nil
- }
- type ScheduledJobV2Alpha1 struct{}
- func (ScheduledJobV2Alpha1) ParamNames() []GeneratorParam {
- return []GeneratorParam{
- {"labels", false},
- {"default-name", false},
- {"name", true},
- {"image", true},
- {"image-pull-policy", false},
- {"port", false},
- {"hostport", false},
- {"stdin", false},
- {"leave-stdin-open", false},
- {"tty", false},
- {"command", false},
- {"args", false},
- {"env", false},
- {"requests", false},
- {"limits", false},
- {"restart", false},
- {"schedule", true},
- }
- }
- func (ScheduledJobV2Alpha1) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
- args, err := getArgs(genericParams)
- if err != nil {
- return nil, err
- }
- envs, err := getV1Envs(genericParams)
- if err != nil {
- return nil, err
- }
- params, err := getParams(genericParams)
- if err != nil {
- return nil, err
- }
- name, err := getName(params)
- if err != nil {
- return nil, err
- }
- labels, err := getLabels(params, true, name)
- if err != nil {
- return nil, err
- }
- podSpec, err := makeV1PodSpec(params, name)
- if err != nil {
- return nil, err
- }
- imagePullPolicy := v1.PullPolicy(params["image-pull-policy"])
- if err = updateV1PodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil {
- return nil, err
- }
- leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false)
- if err != nil {
- return nil, err
- }
- podSpec.Containers[0].StdinOnce = !leaveStdinOpen && podSpec.Containers[0].Stdin
- if err := updateV1PodPorts(params, podSpec); err != nil {
- return nil, err
- }
- restartPolicy := v1.RestartPolicy(params["restart"])
- if len(restartPolicy) == 0 {
- restartPolicy = v1.RestartPolicyNever
- }
- podSpec.RestartPolicy = restartPolicy
- scheduledJob := batchv2alpha1.ScheduledJob{
- ObjectMeta: v1.ObjectMeta{
- Name: name,
- Labels: labels,
- },
- Spec: batchv2alpha1.ScheduledJobSpec{
- Schedule: params["schedule"],
- ConcurrencyPolicy: batchv2alpha1.AllowConcurrent,
- JobTemplate: batchv2alpha1.JobTemplateSpec{
- Spec: batchv2alpha1.JobSpec{
- Template: v1.PodTemplateSpec{
- ObjectMeta: v1.ObjectMeta{
- Labels: labels,
- },
- Spec: *podSpec,
- },
- },
- },
- },
- }
- return &scheduledJob, nil
- }
- type BasicReplicationController struct{}
- func (BasicReplicationController) ParamNames() []GeneratorParam {
- return []GeneratorParam{
- {"labels", false},
- {"default-name", false},
- {"name", true},
- {"replicas", true},
- {"image", true},
- {"image-pull-policy", false},
- {"port", false},
- {"hostport", false},
- {"stdin", false},
- {"tty", false},
- {"command", false},
- {"args", false},
- {"env", false},
- {"requests", false},
- {"limits", false},
- }
- }
- // populateResourceList takes strings of form <resourceName1>=<value1>,<resourceName1>=<value2>
- func populateResourceList(spec string) (api.ResourceList, error) {
- // empty input gets a nil response to preserve generator test expected behaviors
- if spec == "" {
- return nil, nil
- }
- result := api.ResourceList{}
- resourceStatements := strings.Split(spec, ",")
- for _, resourceStatement := range resourceStatements {
- parts := strings.Split(resourceStatement, "=")
- if len(parts) != 2 {
- return nil, fmt.Errorf("Invalid argument syntax %v, expected <resource>=<value>", resourceStatement)
- }
- resourceName := api.ResourceName(parts[0])
- resourceQuantity, err := resource.ParseQuantity(parts[1])
- if err != nil {
- return nil, err
- }
- result[resourceName] = resourceQuantity
- }
- return result, nil
- }
- // populateResourceList takes strings of form <resourceName1>=<value1>,<resourceName1>=<value2>
- func populateV1ResourceList(spec string) (v1.ResourceList, error) {
- // empty input gets a nil response to preserve generator test expected behaviors
- if spec == "" {
- return nil, nil
- }
- result := v1.ResourceList{}
- resourceStatements := strings.Split(spec, ",")
- for _, resourceStatement := range resourceStatements {
- parts := strings.Split(resourceStatement, "=")
- if len(parts) != 2 {
- return nil, fmt.Errorf("Invalid argument syntax %v, expected <resource>=<value>", resourceStatement)
- }
- resourceName := v1.ResourceName(parts[0])
- resourceQuantity, err := resource.ParseQuantity(parts[1])
- if err != nil {
- return nil, err
- }
- result[resourceName] = resourceQuantity
- }
- return result, nil
- }
- // HandleResourceRequirements parses the limits and requests parameters if specified
- func HandleResourceRequirements(params map[string]string) (api.ResourceRequirements, error) {
- result := api.ResourceRequirements{}
- limits, err := populateResourceList(params["limits"])
- if err != nil {
- return result, err
- }
- result.Limits = limits
- requests, err := populateResourceList(params["requests"])
- if err != nil {
- return result, err
- }
- result.Requests = requests
- return result, nil
- }
- // HandleResourceRequirements parses the limits and requests parameters if specified
- func handleV1ResourceRequirements(params map[string]string) (v1.ResourceRequirements, error) {
- result := v1.ResourceRequirements{}
- limits, err := populateV1ResourceList(params["limits"])
- if err != nil {
- return result, err
- }
- result.Limits = limits
- requests, err := populateV1ResourceList(params["requests"])
- if err != nil {
- return result, err
- }
- result.Requests = requests
- return result, nil
- }
- func makePodSpec(params map[string]string, name string) (*api.PodSpec, error) {
- stdin, err := GetBool(params, "stdin", false)
- if err != nil {
- return nil, err
- }
- tty, err := GetBool(params, "tty", false)
- if err != nil {
- return nil, err
- }
- resourceRequirements, err := HandleResourceRequirements(params)
- if err != nil {
- return nil, err
- }
- spec := api.PodSpec{
- Containers: []api.Container{
- {
- Name: name,
- Image: params["image"],
- Stdin: stdin,
- TTY: tty,
- Resources: resourceRequirements,
- },
- },
- }
- return &spec, nil
- }
- func makeV1PodSpec(params map[string]string, name string) (*v1.PodSpec, error) {
- stdin, err := GetBool(params, "stdin", false)
- if err != nil {
- return nil, err
- }
- tty, err := GetBool(params, "tty", false)
- if err != nil {
- return nil, err
- }
- resourceRequirements, err := handleV1ResourceRequirements(params)
- if err != nil {
- return nil, err
- }
- spec := v1.PodSpec{
- Containers: []v1.Container{
- {
- Name: name,
- Image: params["image"],
- Stdin: stdin,
- TTY: tty,
- Resources: resourceRequirements,
- },
- },
- }
- return &spec, nil
- }
- func (BasicReplicationController) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
- args, err := getArgs(genericParams)
- if err != nil {
- return nil, err
- }
- envs, err := getEnvs(genericParams)
- if err != nil {
- return nil, err
- }
- params, err := getParams(genericParams)
- if err != nil {
- return nil, err
- }
- name, err := getName(params)
- if err != nil {
- return nil, err
- }
- labels, err := getLabels(params, true, name)
- if err != nil {
- return nil, err
- }
- count, err := strconv.Atoi(params["replicas"])
- if err != nil {
- return nil, err
- }
- podSpec, err := makePodSpec(params, name)
- if err != nil {
- return nil, err
- }
- imagePullPolicy := api.PullPolicy(params["image-pull-policy"])
- if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil {
- return nil, err
- }
- if err := updatePodPorts(params, podSpec); err != nil {
- return nil, err
- }
- controller := api.ReplicationController{
- ObjectMeta: api.ObjectMeta{
- Name: name,
- Labels: labels,
- },
- Spec: api.ReplicationControllerSpec{
- Replicas: int32(count),
- Selector: labels,
- Template: &api.PodTemplateSpec{
- ObjectMeta: api.ObjectMeta{
- Labels: labels,
- },
- Spec: *podSpec,
- },
- },
- }
- return &controller, nil
- }
- func updatePodContainers(params map[string]string, args []string, envs []api.EnvVar, imagePullPolicy api.PullPolicy, podSpec *api.PodSpec) error {
- if len(args) > 0 {
- command, err := GetBool(params, "command", false)
- if err != nil {
- return err
- }
- if command {
- podSpec.Containers[0].Command = args
- } else {
- podSpec.Containers[0].Args = args
- }
- }
- if len(envs) > 0 {
- podSpec.Containers[0].Env = envs
- }
- if len(imagePullPolicy) > 0 {
- // imagePullPolicy should be valid here since we have verified it before.
- podSpec.Containers[0].ImagePullPolicy = imagePullPolicy
- }
- return nil
- }
- func updateV1PodContainers(params map[string]string, args []string, envs []v1.EnvVar, imagePullPolicy v1.PullPolicy, podSpec *v1.PodSpec) error {
- if len(args) > 0 {
- command, err := GetBool(params, "command", false)
- if err != nil {
- return err
- }
- if command {
- podSpec.Containers[0].Command = args
- } else {
- podSpec.Containers[0].Args = args
- }
- }
- if len(envs) > 0 {
- podSpec.Containers[0].Env = envs
- }
- if len(imagePullPolicy) > 0 {
- // imagePullPolicy should be valid here since we have verified it before.
- podSpec.Containers[0].ImagePullPolicy = imagePullPolicy
- }
- return nil
- }
- func updatePodPorts(params map[string]string, podSpec *api.PodSpec) (err error) {
- port := -1
- hostPort := -1
- if len(params["port"]) > 0 {
- port, err = strconv.Atoi(params["port"])
- if err != nil {
- return err
- }
- }
- if len(params["hostport"]) > 0 {
- hostPort, err = strconv.Atoi(params["hostport"])
- if err != nil {
- return err
- }
- if hostPort > 0 && port < 0 {
- return fmt.Errorf("--hostport requires --port to be specified")
- }
- }
- // Don't include the port if it was not specified.
- if port > 0 {
- podSpec.Containers[0].Ports = []api.ContainerPort{
- {
- ContainerPort: int32(port),
- },
- }
- if hostPort > 0 {
- podSpec.Containers[0].Ports[0].HostPort = int32(hostPort)
- }
- }
- return nil
- }
- func updateV1PodPorts(params map[string]string, podSpec *v1.PodSpec) (err error) {
- port := -1
- hostPort := -1
- if len(params["port"]) > 0 {
- port, err = strconv.Atoi(params["port"])
- if err != nil {
- return err
- }
- }
- if len(params["hostport"]) > 0 {
- hostPort, err = strconv.Atoi(params["hostport"])
- if err != nil {
- return err
- }
- if hostPort > 0 && port < 0 {
- return fmt.Errorf("--hostport requires --port to be specified")
- }
- }
- // Don't include the port if it was not specified.
- if port > 0 {
- podSpec.Containers[0].Ports = []v1.ContainerPort{
- {
- ContainerPort: int32(port),
- },
- }
- if hostPort > 0 {
- podSpec.Containers[0].Ports[0].HostPort = int32(hostPort)
- }
- }
- return nil
- }
- type BasicPod struct{}
- func (BasicPod) ParamNames() []GeneratorParam {
- return []GeneratorParam{
- {"labels", false},
- {"default-name", false},
- {"name", true},
- {"image", true},
- {"image-pull-policy", false},
- {"port", false},
- {"hostport", false},
- {"stdin", false},
- {"leave-stdin-open", false},
- {"tty", false},
- {"restart", false},
- {"command", false},
- {"args", false},
- {"env", false},
- {"requests", false},
- {"limits", false},
- }
- }
- func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
- args, err := getArgs(genericParams)
- if err != nil {
- return nil, err
- }
- envs, err := getEnvs(genericParams)
- if err != nil {
- return nil, err
- }
- params, err := getParams(genericParams)
- if err != nil {
- return nil, err
- }
- name, err := getName(params)
- if err != nil {
- return nil, err
- }
- labels, err := getLabels(params, false, name)
- if err != nil {
- return nil, err
- }
- stdin, err := GetBool(params, "stdin", false)
- if err != nil {
- return nil, err
- }
- leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false)
- if err != nil {
- return nil, err
- }
- tty, err := GetBool(params, "tty", false)
- if err != nil {
- return nil, err
- }
- resourceRequirements, err := HandleResourceRequirements(params)
- if err != nil {
- return nil, err
- }
- restartPolicy := api.RestartPolicy(params["restart"])
- if len(restartPolicy) == 0 {
- restartPolicy = api.RestartPolicyAlways
- }
- // TODO: Figure out why we set ImagePullPolicy here, whether we can make it
- // consistent with the other places imagePullPolicy is set using flag.
- pod := api.Pod{
- ObjectMeta: api.ObjectMeta{
- Name: name,
- Labels: labels,
- },
- Spec: api.PodSpec{
- Containers: []api.Container{
- {
- Name: name,
- Image: params["image"],
- ImagePullPolicy: api.PullIfNotPresent,
- Stdin: stdin,
- StdinOnce: !leaveStdinOpen && stdin,
- TTY: tty,
- Resources: resourceRequirements,
- },
- },
- DNSPolicy: api.DNSClusterFirst,
- RestartPolicy: restartPolicy,
- },
- }
- imagePullPolicy := api.PullPolicy(params["image-pull-policy"])
- if err = updatePodContainers(params, args, envs, imagePullPolicy, &pod.Spec); err != nil {
- return nil, err
- }
- if err := updatePodPorts(params, &pod.Spec); err != nil {
- return nil, err
- }
- return &pod, nil
- }
- func parseEnvs(envArray []string) ([]api.EnvVar, error) {
- envs := make([]api.EnvVar, 0, len(envArray))
- for _, env := range envArray {
- pos := strings.Index(env, "=")
- if pos == -1 {
- return nil, fmt.Errorf("invalid env: %v", env)
- }
- name := env[:pos]
- value := env[pos+1:]
- if len(name) == 0 {
- return nil, fmt.Errorf("invalid env: %v", env)
- }
- if len(validation.IsCIdentifier(name)) != 0 {
- return nil, fmt.Errorf("invalid env: %v", env)
- }
- envVar := api.EnvVar{Name: name, Value: value}
- envs = append(envs, envVar)
- }
- return envs, nil
- }
- func parseV1Envs(envArray []string) ([]v1.EnvVar, error) {
- envs := []v1.EnvVar{}
- for _, env := range envArray {
- pos := strings.Index(env, "=")
- if pos == -1 {
- return nil, fmt.Errorf("invalid env: %v", env)
- }
- name := env[:pos]
- value := env[pos+1:]
- if len(name) == 0 || len(validation.IsCIdentifier(name)) != 0 {
- return nil, fmt.Errorf("invalid env: %v", env)
- }
- envVar := v1.EnvVar{Name: name, Value: value}
- envs = append(envs, envVar)
- }
- return envs, nil
- }
- func newBool(val bool) *bool {
- p := new(bool)
- *p = val
- return p
- }
|