-
Jessica Yuen authored
The `clientConfig` param currently being passed is not needed, because it exists as a package level var in root. It also makes little sense to pass a custom `clientConfig` because if `overrides.Context.Namespace` is populated, the namespace that is returned is configured as an override in the package level `clientConfig` and not the `clientConfig` in the param.
c95cde93
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
apply.go 4.24 KiB
// Copyright 2017 The kubecfg 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 cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
"github.com/ksonnet/kubecfg/metadata"
"github.com/ksonnet/kubecfg/pkg/kubecfg"
)
const (
flagCreate = "create"
flagSkipGc = "skip-gc"
flagGcTag = "gc-tag"
flagDryRun = "dry-run"
// AnnotationGcTag annotation that triggers
// garbage collection. Objects with value equal to
// command-line flag that are *not* in config will be deleted.
AnnotationGcTag = "kubecfg.ksonnet.io/garbage-collect-tag"
// AnnotationGcStrategy controls gc logic. Current values:
// `auto` (default if absent) - do garbage collection
// `ignore` - never garbage collect this object
AnnotationGcStrategy = "kubecfg.ksonnet.io/garbage-collect-strategy"
// GcStrategyAuto is the default automatic gc logic
GcStrategyAuto = "auto"
// GcStrategyIgnore means this object should be ignored by garbage collection
GcStrategyIgnore = "ignore"
)
func init() {
RootCmd.AddCommand(applyCmd)
addEnvCmdFlags(applyCmd)
bindClientGoFlags(applyCmd)
bindJsonnetFlags(applyCmd)
applyCmd.PersistentFlags().Bool(flagCreate, true, "Create missing resources")
applyCmd.PersistentFlags().Bool(flagSkipGc, false, "Don't perform garbage collection, even with --"+flagGcTag)
applyCmd.PersistentFlags().String(flagGcTag, "", "Add this tag to updated objects, and garbage collect existing objects with this tag and not in config")
applyCmd.PersistentFlags().Bool(flagDryRun, false, "Perform only read-only operations")
}
var applyCmd = &cobra.Command{
Use: "apply [env-name] [-f <file-or-dir>]",
Short: `Apply local configuration to remote cluster`,
RunE: func(cmd *cobra.Command, args []string) error {
if len(args) > 1 {
return fmt.Errorf("'apply' takes at most a single argument, that is the name of the environment")
}
flags := cmd.Flags()
var err error
c := kubecfg.ApplyCmd{}
c.Create, err = flags.GetBool(flagCreate)
if err != nil {
return err
}
c.GcTag, err = flags.GetString(flagGcTag)
if err != nil {
return err
}
c.SkipGc, err = flags.GetBool(flagSkipGc)
if err != nil {
return err
}
c.DryRun, err = flags.GetBool(flagDryRun)
if err != nil {
return err
}
cwd, err := os.Getwd()
if err != nil {
return err
}
wd := metadata.AbsPath(cwd)
envSpec, err := parseEnvCmd(cmd, args)
if err != nil {
return err
}
c.ClientPool, c.Discovery, err = restClientPool(cmd, envSpec.env)
if err != nil {
return err
}
c.DefaultNamespace, err = defaultNamespace()
if err != nil {
return err
}
objs, err := expandEnvCmdObjs(cmd, envSpec, wd)
if err != nil {
return err
}
return c.Run(objs, wd)
},
Long: `Update (or optionally create) Kubernetes resources on the cluster using the
local configuration. Use the '--create' flag to control whether we create them
if they do not exist (default: true).
ksonnet applications are accepted, as well as normal JSON, YAML, and Jsonnet
files.`,
Example: ` # Create or update all resources described in a ksonnet application, and
# running in the 'dev' environment. Can be used in any subdirectory of the
# application.
ksonnet apply dev
# Create or update resources described in a YAML file. Automatically picks up
# the cluster's location from '$KUBECONFIG'.
ksonnet appy -f ./pod.yaml
# Create or update resources described in the JSON file. Changes are deployed
# to the cluster pointed at the 'dev' environment.
ksonnet apply dev -f ./pod.json
# Update resources described in a YAML file, and running in cluster referred
# to by './kubeconfig'.
ksonnet apply --kubeconfig=./kubeconfig -f ./pod.yaml
# Display set of actions we will execute when we run 'apply'.
ksonnet apply dev --dry-run`,
}