Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenShift oc create fails with "already exists"

Attempting to create a set of resources based on a file via oc create fails if they already exist.

According to the docs here oc create should:

Parse a configuration file and create one or more OpenShift Enterprise objects ... Any existing resources are ignored.

(emphasis mine).

I can't see any config options for this command or globally that would alter this behaviour and it seems to me to be counter to the docs.

The command I ran is oc create -f some.file

The output is:

Error from server: services 'my-app' already exists
Error from server: buildconfigs 'my-app' already exists
Error from server: imagestreams 'my-app' already exists
Error from server: deploymentconfigs 'my-app' already exists
Error from server: routes 'my-app' already exists
Error from server: secrets 'my-app' already exists

It also exits with a non-zero exit code, so it's not just a warning. Am I missing something obvious here or misunderstanding what the documentation is saying?

I just want to be able to apply this file and ensure the state of the OpenShift project afterwards.

like image 714
Tom Manterfield Avatar asked Oct 16 '17 15:10

Tom Manterfield


2 Answers

How about using oc replace:

oc replace --filename file.yml --force
like image 76
flags Avatar answered Nov 10 '22 08:11

flags


The documentation is perhaps a bit badly worded. What it is saying is that if you try and create an object of a specific type where an object of that type with that name already exists, your attempt to create the new one will be ignored.

The situation you have will occur if you tried to create multiple instances of an application from the same raw resource definitions. There is no way using oc create -f from a set of raw resource definitions to override names from the command line so a second deployment is distinct.

What you would need to do if you want to create multiple instances from the same resource definitions, is to convert the definitions into a template and parameterise on the name so that you can pass in a different name for different instances. That way there will not be a clash.

Also, when you do create a set of resources, it is usually better to use the one name across all the resource types and not use a different name for each, eg., use just 'my-app-name' for all of them, and not separately, 'my-buildconfig', 'my-imagestream'.

More importantly, you need to ensure you add a label with same key/value on them all so it is easy then to work with them together, including deleting them all in one go.

What is the type of application you are trying to deploy? I can possibly point you at example templates you can use as a guide.


UPDATE 1

If you want to be able run oc create -f and have it not complain if the resources already exist, but create them if they don't, use oc apply -f instead.

like image 21
Graham Dumpleton Avatar answered Nov 10 '22 08:11

Graham Dumpleton