diff --git a/pkg/cmd/cli/cmd/cancelbuild.go b/pkg/cmd/cli/cmd/cancelbuild.go index b20173493530..a81867bf2a84 100644 --- a/pkg/cmd/cli/cmd/cancelbuild.go +++ b/pkg/cmd/cli/cmd/cancelbuild.go @@ -9,6 +9,7 @@ import ( kapi "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/errors" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/resource" buildapi "github.com/openshift/origin/pkg/build/api" "github.com/openshift/origin/pkg/cmd/util/clientcmd" @@ -68,11 +69,20 @@ func RunCancelBuild(f *clientcmd.Factory, out io.Writer, cmd *cobra.Command, arg return err } buildClient := client.Builds(namespace) - build, err := buildClient.Get(buildName) + + mapper, typer := f.Object() + obj, err := resource.NewBuilder(mapper, typer, f.ClientMapperForCommand()). + NamespaceParam(namespace). + ResourceNames("builds", buildName). + SingleResourceType(). + Do().Object() if err != nil { return err } - + build, ok := obj.(*buildapi.Build) + if !ok { + return fmt.Errorf("%q is not a valid build", buildName) + } if !isBuildCancellable(build) { return nil } diff --git a/pkg/cmd/cli/cmd/deploy.go b/pkg/cmd/cli/cmd/deploy.go index b7bdc080c8d8..eecfa0492e69 100644 --- a/pkg/cmd/cli/cmd/deploy.go +++ b/pkg/cmd/cli/cmd/deploy.go @@ -120,7 +120,7 @@ func NewCmdDeploy(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.C func (o *DeployOptions) Complete(f *clientcmd.Factory, args []string, out io.Writer) error { if len(args) > 1 { - return errors.New("only one deploymentConfig name is supported as argument.") + return errors.New("only one deployment config name is supported as argument.") } var err error @@ -139,11 +139,7 @@ func (o *DeployOptions) Complete(f *clientcmd.Factory, args []string, out io.Wri o.out = out if len(args) > 0 { - name := args[0] - if strings.Index(name, "/") == -1 { - name = fmt.Sprintf("dc/%s", name) - } - o.deploymentConfigName = name + o.deploymentConfigName = args[0] } return nil @@ -151,7 +147,7 @@ func (o *DeployOptions) Complete(f *clientcmd.Factory, args []string, out io.Wri func (o DeployOptions) Validate() error { if len(o.deploymentConfigName) == 0 { - return errors.New("a deploymentConfig name is required.") + return errors.New("a deployment config name is required.") } numOptions := 0 if o.deployLatest { @@ -175,7 +171,7 @@ func (o DeployOptions) Validate() error { func (o DeployOptions) RunDeploy() error { r := o.builder. NamespaceParam(o.namespace). - ResourceTypeOrNameArgs(false, o.deploymentConfigName). + ResourceNames("deploymentconfigs", o.deploymentConfigName). SingleResourceType(). Do() resultObj, err := r.Object() @@ -184,7 +180,7 @@ func (o DeployOptions) RunDeploy() error { } config, ok := resultObj.(*deployapi.DeploymentConfig) if !ok { - return fmt.Errorf("%s is not a valid deploymentconfig", o.deploymentConfigName) + return fmt.Errorf("%s is not a valid deployment config", o.deploymentConfigName) } switch { diff --git a/pkg/cmd/cli/cmd/startbuild.go b/pkg/cmd/cli/cmd/startbuild.go index afc4a31537ef..3c7932e651ae 100644 --- a/pkg/cmd/cli/cmd/startbuild.go +++ b/pkg/cmd/cli/cmd/startbuild.go @@ -27,6 +27,7 @@ import ( buildapi "github.com/openshift/origin/pkg/build/api" osclient "github.com/openshift/origin/pkg/client" + osutil "github.com/openshift/origin/pkg/cmd/util" "github.com/openshift/origin/pkg/cmd/util/clientcmd" "github.com/openshift/origin/pkg/generate/git" "github.com/openshift/source-to-image/pkg/tar" @@ -129,15 +130,37 @@ func RunStartBuild(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra return cmdutil.UsageError(cmd, "Must pass a name of a build config or specify build name with '--from-build' flag") } - name := buildName - isBuild := true + namespace, _, err := f.DefaultNamespace() + if err != nil { + return err + } + + var ( + name = buildName + resource = "builds" + ) + + if len(name) == 0 && len(args) > 0 && len(args[0]) > 0 { + mapper, _ := f.Object() + resource, name, err = osutil.ResolveResource("buildconfigs", args[0], mapper) + if err != nil { + return err + } + switch resource { + case "buildconfigs": + // no special handling required + case "builds": + return fmt.Errorf("use --from-build to rerun your builds") + default: + return fmt.Errorf("invalid resource provided: %s", resource) + } + } if len(name) == 0 { - name = args[0] - isBuild = false + return fmt.Errorf("a resource name is required either as an argument or by using --from-build") } if webhooks.Provided() { - return RunListBuildWebHooks(f, out, cmd.Out(), name, isBuild, webhooks.String()) + return RunListBuildWebHooks(f, out, cmd.Out(), name, resource, webhooks.String()) } client, _, err := f.Clients() @@ -145,11 +168,6 @@ func RunStartBuild(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra return err } - namespace, _, err := f.DefaultNamespace() - if err != nil { - return err - } - request := &buildapi.BuildRequest{ ObjectMeta: kapi.ObjectMeta{Name: name}, } @@ -166,7 +184,7 @@ func RunStartBuild(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra var newBuild *buildapi.Build switch { - case !isBuild && (len(fromFile) > 0 || len(fromDir) > 0 || len(fromRepo) > 0): + case len(args) > 0 && (len(fromFile) > 0 || len(fromDir) > 0 || len(fromRepo) > 0): request := &buildapi.BinaryBuildRequestOptions{ ObjectMeta: kapi.ObjectMeta{ Name: name, @@ -177,16 +195,16 @@ func RunStartBuild(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra if newBuild, err = streamPathToBuild(git, in, cmd.Out(), client.BuildConfigs(namespace), fromDir, fromFile, fromRepo, request); err != nil { return err } - - case isBuild: + case resource == "builds": if newBuild, err = client.Builds(namespace).Clone(request); err != nil { return err } - - default: + case resource == "buildconfigs": if newBuild, err = client.BuildConfigs(namespace).Instantiate(request); err != nil { return err } + default: + return fmt.Errorf("invalid resource provided: %s", resource) } fmt.Fprintln(out, newBuild.Name) @@ -240,7 +258,7 @@ func RunStartBuild(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra } // RunListBuildWebHooks prints the webhooks for the provided build config. -func RunListBuildWebHooks(f *clientcmd.Factory, out, errOut io.Writer, name string, isBuild bool, webhookFilter string) error { +func RunListBuildWebHooks(f *clientcmd.Factory, out, errOut io.Writer, name, resource, webhookFilter string) error { generic, github := false, false prefix := false switch webhookFilter { @@ -263,7 +281,10 @@ func RunListBuildWebHooks(f *clientcmd.Factory, out, errOut io.Writer, name stri return err } - if isBuild { + switch resource { + case "buildconfigs": + // no special handling required + case "builds": build, err := client.Builds(namespace).Get(name) if err != nil { return err @@ -276,7 +297,10 @@ func RunListBuildWebHooks(f *clientcmd.Factory, out, errOut io.Writer, name stri namespace = ref.Namespace } name = ref.Name + default: + return fmt.Errorf("invalid resource provided: %s", resource) } + config, err := client.BuildConfigs(namespace).Get(name) if err != nil { return err diff --git a/pkg/cmd/cli/secrets/add_secret_to_obj.go b/pkg/cmd/cli/secrets/add_secret_to_obj.go index 5772827bf7cc..80f473f45b07 100644 --- a/pkg/cmd/cli/secrets/add_secret_to_obj.go +++ b/pkg/cmd/cli/secrets/add_secret_to_obj.go @@ -162,7 +162,7 @@ func (o AddSecretOptions) Validate() error { func (o AddSecretOptions) AddSecrets() error { r := resource.NewBuilder(o.Mapper, o.Typer, o.ClientMapper). NamespaceParam(o.Namespace). - ResourceTypeOrNameArgs(false, o.TargetName). + ResourceNames("serviceaccounts", o.TargetName). SingleResourceType(). Do() if r.Err() != nil { @@ -223,7 +223,7 @@ func (o AddSecretOptions) addSecretsToServiceAccount(serviceaccount *kapi.Servic func (o AddSecretOptions) getSecrets() ([]*kapi.Secret, error) { r := resource.NewBuilder(o.Mapper, o.Typer, o.ClientMapper). NamespaceParam(o.Namespace). - ResourceTypeOrNameArgs(false, o.SecretNames...). + ResourceNames("secrets", o.SecretNames...). SingleResourceType(). Do() if r.Err() != nil { diff --git a/pkg/cmd/experimental/buildchain/buildchain.go b/pkg/cmd/experimental/buildchain/buildchain.go index 79cece997778..96a7eb6e680c 100644 --- a/pkg/cmd/experimental/buildchain/buildchain.go +++ b/pkg/cmd/experimental/buildchain/buildchain.go @@ -14,6 +14,7 @@ import ( "github.com/openshift/origin/pkg/client" "github.com/openshift/origin/pkg/cmd/cli/describe" + osutil "github.com/openshift/origin/pkg/cmd/util" "github.com/openshift/origin/pkg/cmd/util/clientcmd" imageapi "github.com/openshift/origin/pkg/image/api" imagegraph "github.com/openshift/origin/pkg/image/graph/nodes" @@ -43,7 +44,6 @@ const BuildChainRecommendedCommandName = "build-chain" // BuildChainOptions contains all the options needed for build-chain type BuildChainOptions struct { name string - tag string defaultNamespace string namespaces sets.String @@ -62,7 +62,7 @@ func NewCmdBuildChain(name, fullName string, f *clientcmd.Factory, out io.Writer namespaces: sets.NewString(), } cmd := &cobra.Command{ - Use: "build-chain [IMAGESTREAM:TAG]", + Use: "build-chain IMAGESTREAMTAG", Short: "Output the inputs and dependencies of your builds", Long: buildChainLong, Example: fmt.Sprintf(buildChainExample, fullName), @@ -84,7 +84,7 @@ func NewCmdBuildChain(name, fullName string, f *clientcmd.Factory, out io.Writer // Complete completes the required options for build-chain func (o *BuildChainOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, args []string, out io.Writer) error { if len(args) != 1 { - return cmdutil.UsageError(cmd, "Must pass an image stream name and optionally a tag. In case of an empty tag, 'latest' will be used.") + return cmdutil.UsageError(cmd, "Must pass an image stream tag. If only an image stream name is specified, 'latest' will be used for the tag.") } // Setup client @@ -94,12 +94,20 @@ func (o *BuildChainOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, a } o.c, o.t = oc, oc - // Parse user input - o.name, o.tag, err = buildChainInput(args[0]) + resource := "" + mapper, _ := f.Object() + resource, o.name, err = osutil.ResolveResource("imagestreamtags", args[0], mapper) if err != nil { - return cmdutil.UsageError(cmd, err.Error()) + return err + } + + switch resource { + case "imagestreamtags": + o.name = imageapi.NormalizeImageStreamTag(o.name) + glog.V(4).Infof("Using %q as the image stream tag to look dependencies for", o.name) + default: + return fmt.Errorf("invalid resource provided: %s", resource) } - glog.V(4).Infof("Using '%s:%s' as the image stream tag to look dependencies for", o.name, o.tag) // Setup namespace if o.allNamespaces { @@ -120,7 +128,7 @@ func (o *BuildChainOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, a } o.defaultNamespace = namespace - glog.V(4).Infof("Using %q as the namespace for '%s:%s'", o.defaultNamespace, o.name, o.tag) + glog.V(4).Infof("Using %q as the namespace for %q", o.defaultNamespace, o.name) o.namespaces.Insert(namespace) glog.V(4).Infof("Will look for deps in %s", strings.Join(o.namespaces.List(), ",")) @@ -130,10 +138,7 @@ func (o *BuildChainOptions) Complete(f *clientcmd.Factory, cmd *cobra.Command, a // Validate returns validation errors regarding build-chain func (o *BuildChainOptions) Validate() error { if len(o.name) == 0 { - return fmt.Errorf("image stream name cannot be empty") - } - if len(o.tag) == 0 { - o.tag = imageapi.DefaultImageTag + return fmt.Errorf("image stream tag cannot be empty") } if len(o.defaultNamespace) == 0 { return fmt.Errorf("default namespace cannot be empty") @@ -153,15 +158,17 @@ func (o *BuildChainOptions) Validate() error { // RunBuildChain contains all the necessary functionality for the OpenShift // experimental build-chain command func (o *BuildChainOptions) RunBuildChain() error { - ist := imagegraph.MakeImageStreamTagObjectMeta(o.defaultNamespace, o.name, o.tag) + ist := imagegraph.MakeImageStreamTagObjectMeta2(o.defaultNamespace, o.name) + desc, err := describe.NewChainDescriber(o.c, o.namespaces, o.output).Describe(ist, !o.triggerOnly) if err != nil { if _, isNotFoundErr := err.(describe.NotFoundErr); isNotFoundErr { + name, tag, _ := imageapi.SplitImageStreamTag(o.name) // Try to get the imageStreamTag via a direct GET - if _, getErr := o.t.ImageStreamTags(o.defaultNamespace).Get(o.name, o.tag); getErr != nil { + if _, getErr := o.t.ImageStreamTags(o.defaultNamespace).Get(name, tag); getErr != nil { return getErr } - fmt.Printf("Image stream tag '%s:%s' in %q doesn't have any dependencies.\n", o.name, o.tag, o.defaultNamespace) + fmt.Printf("Image stream tag %q in %q doesn't have any dependencies.\n", o.name, o.defaultNamespace) return nil } return err @@ -171,26 +178,3 @@ func (o *BuildChainOptions) RunBuildChain() error { return nil } - -// buildChainInput parses user input and returns a stream name, a tag -// and an error if any -func buildChainInput(input string) (string, string, error) { - // Split name and tag - name, tag, _ := imageapi.SplitImageStreamTag(input) - - // Support resource type/name syntax - // TODO: Use the RESTMapper to resolve this - resource := strings.Split(name, "/") - switch len(resource) { - case 1: - case 2: - resourceType := resource[0] - if resourceType != "istag" && resourceType != "imagestreamtag" { - return "", "", fmt.Errorf("invalid resource type %q", resourceType) - } - default: - return "", "", fmt.Errorf("invalid image stream name %q", name) - } - - return name, tag, nil -} diff --git a/pkg/cmd/util/cmd.go b/pkg/cmd/util/cmd.go index c4eaf0ab45ac..8c92ad137bdc 100644 --- a/pkg/cmd/util/cmd.go +++ b/pkg/cmd/util/cmd.go @@ -1,6 +1,7 @@ package util import ( + "errors" "fmt" "io" "path/filepath" @@ -8,6 +9,7 @@ import ( "github.com/spf13/cobra" + "k8s.io/kubernetes/pkg/api/meta" kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" ) @@ -31,3 +33,30 @@ func GetDisplayFilename(filename string) string { return filename } + +// ResolveResource returns the resource type and name of the resourceString. +// If the resource string has no specified type, defaultResource will be returned. +func ResolveResource(defaultResource, resourceString string, mapper meta.RESTMapper) (string, string, error) { + if mapper == nil { + return "", "", errors.New("mapper cannot be nil") + } + + var name string + parts := strings.Split(resourceString, "/") + switch len(parts) { + case 1: + name = parts[0] + case 2: + _, kind, err := mapper.VersionAndKindForResource(parts[0]) + if err != nil { + return "", "", err + } + name = parts[1] + resource, _ := meta.KindToResource(kind, false) + return resource, name, nil + default: + return "", "", fmt.Errorf("invalid resource format: %s", resourceString) + } + + return defaultResource, name, nil +} diff --git a/pkg/cmd/util/cmd_test.go b/pkg/cmd/util/cmd_test.go new file mode 100644 index 000000000000..46958765551e --- /dev/null +++ b/pkg/cmd/util/cmd_test.go @@ -0,0 +1,181 @@ +package util_test + +import ( + "testing" + + "k8s.io/kubernetes/pkg/kubectl" + + "github.com/openshift/origin/pkg/api/latest" + "github.com/openshift/origin/pkg/cmd/util" + "github.com/openshift/origin/pkg/cmd/util/clientcmd" +) + +func TestResolveResource(t *testing.T) { + mapper := clientcmd.ShortcutExpander{RESTMapper: kubectl.ShortcutExpander{RESTMapper: latest.RESTMapper}} + + tests := []struct { + name string + defaultResource string + resourceString string + expectedResource string + expectedName string + expectedErr bool + }{ + { + name: "invalid case #1", + defaultResource: "", + resourceString: "a/b/c", + expectedResource: "", + expectedName: "", + expectedErr: true, + }, + { + name: "invalid case #2", + defaultResource: "", + resourceString: "foo/bar", + expectedResource: "", + expectedName: "", + expectedErr: true, + }, + { + name: "empty resource string case #1", + defaultResource: "", + resourceString: "", + expectedResource: "", + expectedName: "", + expectedErr: false, + }, + { + name: "empty resource string case #2", + defaultResource: "", + resourceString: "bar", + expectedResource: "", + expectedName: "bar", + expectedErr: false, + }, + { + name: "empty resource string case #3", + defaultResource: "foo", + resourceString: "bar", + expectedResource: "foo", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(KUBE) short name", + defaultResource: "foo", + resourceString: "rc/bar", + expectedResource: "replicationcontrollers", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(KUBE) long name, case insensitive #1", + defaultResource: "foo", + resourceString: "replicationcontroller/bar", + expectedResource: "replicationcontrollers", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(KUBE) long name, case insensitive #2", + defaultResource: "foo", + resourceString: "replicationcontrollers/bar", + expectedResource: "replicationcontrollers", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(KUBE) long name, case insensitive #3", + defaultResource: "foo", + resourceString: "ReplicationControllers/bar", + expectedResource: "replicationcontrollers", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(KUBE) long name, case insensitive #4", + defaultResource: "foo", + resourceString: "ReplicationControllers/bar", + expectedResource: "replicationcontrollers", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(KUBE) long name, case insensitive #5", + defaultResource: "foo", + resourceString: "ReplicationControllers/Bar", + expectedResource: "replicationcontrollers", + expectedName: "Bar", + expectedErr: false, + }, + { + name: "(ORIGIN) short name", + defaultResource: "foo", + resourceString: "bc/bar", + expectedResource: "buildconfigs", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(ORIGIN) long name, case insensitive #1", + defaultResource: "foo", + resourceString: "buildconfig/bar", + expectedResource: "buildconfigs", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(ORIGIN) long name, case insensitive #2", + defaultResource: "foo", + resourceString: "buildconfigs/bar", + expectedResource: "buildconfigs", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(ORIGIN) long name, case insensitive #3", + defaultResource: "foo", + resourceString: "BuildConfigs/bar", + expectedResource: "buildconfigs", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(ORIGIN) long name, case insensitive #4", + defaultResource: "foo", + resourceString: "BuildConfigs/bar", + expectedResource: "buildconfigs", + expectedName: "bar", + expectedErr: false, + }, + { + name: "(ORIGIN) long name, case insensitive #5", + defaultResource: "foo", + resourceString: "BuildConfigs/Bar", + expectedResource: "buildconfigs", + expectedName: "Bar", + expectedErr: false, + }, + } + + for _, test := range tests { + gotResource, gotName, gotErr := util.ResolveResource(test.defaultResource, test.resourceString, mapper) + if gotErr != nil && !test.expectedErr { + t.Errorf("%s: expected no error, got %v", test.name, gotErr) + continue + } + if gotErr == nil && test.expectedErr { + t.Errorf("%s: expected error but got none", test.name) + continue + } + if gotResource != test.expectedResource { + t.Errorf("%s: expected resource type %s, got %s", test.name, test.expectedResource, gotResource) + continue + } + if gotName != test.expectedName { + t.Errorf("%s: expected resource name %s, got %s", test.name, test.expectedName, gotName) + continue + } + } +} diff --git a/pkg/image/api/helper.go b/pkg/image/api/helper.go index 455db8418f53..270789269d44 100644 --- a/pkg/image/api/helper.go +++ b/pkg/image/api/helper.go @@ -210,6 +210,16 @@ func JoinImageStreamTag(name, tag string) string { return fmt.Sprintf("%s:%s", name, tag) } +// NormalizeImageStreamTag normalizes an image stream tag by defaulting to 'latest' +// if no tag has been specified. +func NormalizeImageStreamTag(name string) string { + if !strings.Contains(name, ":") { + // Default to latest + return JoinImageStreamTag(name, DefaultImageTag) + } + return name +} + // ImageWithMetadata returns a copy of image with the DockerImageMetadata filled in // from the raw DockerImageManifest data stored in the image. func ImageWithMetadata(image Image) (*Image, error) { diff --git a/test/cmd/admin.sh b/test/cmd/admin.sh index c7de8151e6f9..ffd9a3862f9e 100755 --- a/test/cmd/admin.sh +++ b/test/cmd/admin.sh @@ -173,6 +173,9 @@ echo "registry: ok" # Test building a dependency tree oc process -f examples/sample-app/application-template-stibuild.json -l build=sti | oc create -f - +# Test both the type/name resource syntax and the fact that istag/origin-ruby-sample:latest is still +# not created but due to a buildConfig pointing to it, we get back its graph of deps. +[ "$(oadm build-chain istag/origin-ruby-sample | grep 'imagestreamtag/origin-ruby-sample:latest')" ] [ "$(oadm build-chain ruby-20-centos7 -o dot | grep 'graph')" ] oc delete all -l build=sti echo "ex build-chain: ok" diff --git a/test/cmd/builds.sh b/test/cmd/builds.sh index 5847856e202d..1660fc624dae 100755 --- a/test/cmd/builds.sh +++ b/test/cmd/builds.sh @@ -26,16 +26,16 @@ oc get buildConfigs oc get bc oc get builds -REAL_OUTPUT_TO=$(oc get bc/ruby-sample-build -t '{{ .spec.output.to.name }}') +REAL_OUTPUT_TO=$(oc get bc/ruby-sample-build --template='{{ .spec.output.to.name }}') oc patch bc/ruby-sample-build -p '{"spec":{"output":{"to":{"name":"different:tag1"}}}}' -oc get bc/ruby-sample-build -t '{{ .spec.output.to.name }}' | grep 'different' +oc get bc/ruby-sample-build --template='{{ .spec.output.to.name }}' | grep 'different' oc patch bc/ruby-sample-build -p "{\"spec\":{\"output\":{\"to\":{\"name\":\"${REAL_OUTPUT_TO}\"}}}}" echo "patchAnonFields: ok" [ "$(oc describe buildConfigs ruby-sample-build | grep --text "Webhook GitHub" | grep -F "${url}/oapi/v1/namespaces/${project}/buildconfigs/ruby-sample-build/webhooks/secret101/github")" ] [ "$(oc describe buildConfigs ruby-sample-build | grep --text "Webhook Generic" | grep -F "${url}/oapi/v1/namespaces/${project}/buildconfigs/ruby-sample-build/webhooks/secret101/generic")" ] oc start-build --list-webhooks='all' ruby-sample-build -[ "$(oc start-build --list-webhooks='all' ruby-sample-build | grep --text "generic")" ] +[ "$(oc start-build --list-webhooks='all' bc/ruby-sample-build | grep --text "generic")" ] [ "$(oc start-build --list-webhooks='all' ruby-sample-build | grep --text "github")" ] [ "$(oc start-build --list-webhooks='github' ruby-sample-build | grep --text "secret101")" ] [ ! "$(oc start-build --list-webhooks='blah')" ] @@ -50,11 +50,15 @@ oc create -f test/integration/fixtures/test-buildcli.json # the build should use the image field as defined in the buildconfig started=$(oc start-build ruby-sample-build-invalidtag) oc describe build ${started} | grep openshift/ruby-20-centos7$ +frombuild=$(oc start-build --from-build="${started}") +oc describe build ${frombuild} | grep openshift/ruby-20-centos7$ echo "start-build: ok" oc cancel-build "${started}" --dump-logs --restart +oc delete all --all +oc process -f examples/sample-app/application-template-dockerbuild.json -l build=docker | oc create -f - +tryuntil oc get build/ruby-sample-build-1 +# Uses type/name resource syntax +oc cancel-build build/ruby-sample-build-1 +oc delete all --all echo "cancel-build: ok" - -[ "$(oc delete is/ruby-20-centos7-buildcli | grep 'imagestream "ruby-20-centos7-buildcli" deleted')" ] -[ "$(oc delete bc/ruby-sample-build-validtag -o name | grep 'buildconfig/ruby-sample-build-validtag')" ] -[ "$(oc delete bc/ruby-sample-build-invalidtag | grep 'buildconfig "ruby-sample-build-invalidtag" deleted')" ] diff --git a/test/cmd/deployments.sh b/test/cmd/deployments.sh index 985d68f5d757..3d923f65b8b5 100755 --- a/test/cmd/deployments.sh +++ b/test/cmd/deployments.sh @@ -31,6 +31,7 @@ oc describe deploymentConfigs test-deployment-config [ "$(oc env dc/test-deployment-config TEST=bar OTHER=baz BAR-)" ] oc deploy test-deployment-config +oc deploy dc/test-deployment-config oc delete deploymentConfigs test-deployment-config echo "deploymentConfigs: ok" diff --git a/test/cmd/secrets.sh b/test/cmd/secrets.sh index 4849c5c27449..0b345c5ef6c2 100755 --- a/test/cmd/secrets.sh +++ b/test/cmd/secrets.sh @@ -24,11 +24,11 @@ oc secrets new from-file .dockercfg=${HOME}/dockerconfig # attach secrets to service account # single secret with prefix -oc secrets add serviceaccounts/deployer secrets/dockercfg +oc secrets add deployer dockercfg # don't add the same secret twice -oc secrets add serviceaccounts/deployer secrets/dockercfg secrets/from-file +oc secrets add serviceaccounts/deployer dockercfg secrets/from-file # make sure we can add as as pull secret -oc secrets add serviceaccounts/deployer secrets/dockercfg secrets/from-file --for=pull +oc secrets add deployer dockercfg from-file --for=pull # make sure we can add as as pull secret and mount secret at once oc secrets add serviceaccounts/deployer secrets/dockercfg secrets/from-file --for=pull,mount