diff --git a/src/main/java/com/openshift/internal/restclient/model/BuildConfig.java b/src/main/java/com/openshift/internal/restclient/model/BuildConfig.java index c9588d7e..b703ee9f 100644 --- a/src/main/java/com/openshift/internal/restclient/model/BuildConfig.java +++ b/src/main/java/com/openshift/internal/restclient/model/BuildConfig.java @@ -26,6 +26,7 @@ import com.openshift.restclient.IClient; import com.openshift.restclient.images.DockerImageURI; import com.openshift.restclient.model.IBuildConfig; +import com.openshift.restclient.model.IObjectReference; import com.openshift.restclient.model.build.BuildSourceType; import com.openshift.restclient.model.build.BuildStrategyType; import com.openshift.restclient.model.build.BuildTriggerType; @@ -73,6 +74,15 @@ public BuildConfig(ModelNode node, IClient client, Map overri CapabilityInitializer.initializeCapabilities(getModifiableCapabilities(), this, client); } + + @Override + public IObjectReference getBuildOutputReference() { + ModelNode node = get("spec.output.to"); + if(!node.isDefined()) return null; + return new ObjectReference(node); + } + + @Override public List getBuildTriggers() { List triggers = new ArrayList(); diff --git a/src/main/java/com/openshift/internal/restclient/model/ImageStream.java b/src/main/java/com/openshift/internal/restclient/model/ImageStream.java index c6640318..a2a6ffb6 100644 --- a/src/main/java/com/openshift/internal/restclient/model/ImageStream.java +++ b/src/main/java/com/openshift/internal/restclient/model/ImageStream.java @@ -8,27 +8,33 @@ ******************************************************************************/ package com.openshift.internal.restclient.model; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; +import com.openshift.internal.restclient.model.image.TagReference; import com.openshift.restclient.IClient; import com.openshift.restclient.images.DockerImageURI; import com.openshift.restclient.model.IImageStream; +import com.openshift.restclient.model.image.ITagReference; /** * @author Jeff Cantrill */ public class ImageStream extends KubernetesResource implements IImageStream { - private static final String IMAGESTREAM_DOCKER_IMAGE_REPO = "spec.dockerImageRepository"; - private static final String IMAGESTREAM_SPEC_TAGS = "spec.tags"; - private static final String IMAGESTREAM_STATUS_TAGS = "status.tags"; + private static final String DOCKER_IMAGE_REPO = "status.dockerImageRepository"; + private static final String SPEC_TAGS = "spec.tags"; + private static final String STATUS_TAGS = "status.tags"; private static final String TAG = "tag"; private static final String ITEMS = "items"; private static final String IMAGE = "image"; + private Map propertyKeys; public ImageStream(){ this(new ModelNode(), null, null); @@ -36,21 +42,37 @@ public ImageStream(){ public ImageStream(ModelNode node, IClient client, Map propertyKeys) { super(node, client, propertyKeys); + this.propertyKeys = propertyKeys; } @Override public void setDockerImageRepository(DockerImageURI uri) { - set(IMAGESTREAM_DOCKER_IMAGE_REPO, uri.getAbsoluteUri()); + set(DOCKER_IMAGE_REPO, uri.getAbsoluteUri()); } @Override public DockerImageURI getDockerImageRepository() { - return new DockerImageURI(asString(IMAGESTREAM_DOCKER_IMAGE_REPO)); + return new DockerImageURI(asString(DOCKER_IMAGE_REPO)); + } + + + @Override + public Collection getTagNames() { + ModelNode node = get(STATUS_TAGS); + if(!node.isDefined()) return new ArrayList<>(); + return node.asList().stream().map(n->asString(n,TAG)).collect(Collectors.toList()); + } + + @Override + public Collection getTags() { + ModelNode node = get(SPEC_TAGS); + if(!node.isDefined()) return new ArrayList<>(); + return node.asList().stream().map(n->new TagReference(n, propertyKeys)).collect(Collectors.toList()); } @Override public void setTag(String newTag, String fromTag) { - ModelNode tags = get(IMAGESTREAM_SPEC_TAGS); + ModelNode tags = get(SPEC_TAGS); ModelNode tag = new ModelNode(); tag.get("name").set(newTag); ModelNode from = new ModelNode(); @@ -73,7 +95,7 @@ protected String getImageId(List itemWrappers) { @Override public String getImageId(String tagName) { String imageId = null; - ModelNode tags = get(IMAGESTREAM_STATUS_TAGS); + ModelNode tags = get(STATUS_TAGS); if (tags.getType() != ModelType.LIST || tagName == null) return null; diff --git a/src/main/java/com/openshift/internal/restclient/model/image/TagReference.java b/src/main/java/com/openshift/internal/restclient/model/image/TagReference.java new file mode 100644 index 00000000..2992a23b --- /dev/null +++ b/src/main/java/com/openshift/internal/restclient/model/image/TagReference.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2016 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package com.openshift.internal.restclient.model.image; + +import static com.openshift.internal.util.JBossDmrExtentions.*; +import java.util.Map; + +import org.jboss.dmr.ModelNode; + +import com.openshift.internal.restclient.model.ModelNodeAdapter; +import com.openshift.internal.restclient.model.ObjectReference; +import com.openshift.internal.restclient.model.properties.ResourcePropertyKeys; +import com.openshift.restclient.model.IObjectReference; +import com.openshift.restclient.model.image.ITagReference; + +public class TagReference extends ModelNodeAdapter implements ITagReference, ResourcePropertyKeys { + + private static final String TAG_ANNOTATIONS = "annotations"; + + public TagReference(ModelNode node, Map propertyKeys) { + super(node, propertyKeys); + } + + @Override + public boolean isAnnotatedWith(String key) { + return getAnnotations().containsKey(key); + } + + @Override + public String getAnnotation(String key) { + return getAnnotations().get(key); + } + + @Override + public void setAnnotation(String key, String value) { + if(value == null) return; + ModelNode annotations = get(getNode(), getPropertyKeys(), TAG_ANNOTATIONS); + annotations.get(key).set(value); + } + + @Override + public Map getAnnotations() { + return asMap(getNode(), getPropertyKeys(), TAG_ANNOTATIONS); + } + + @Override + public String getName() { + return asString(getNode(),getPropertyKeys(), NAME); + } + + @Override + public IObjectReference getFrom() { + return new ObjectReference(get(getNode(), getPropertyKeys(), "from")); + } + +} diff --git a/src/main/java/com/openshift/restclient/model/Annotatable.java b/src/main/java/com/openshift/restclient/model/Annotatable.java new file mode 100644 index 00000000..ad6937c4 --- /dev/null +++ b/src/main/java/com/openshift/restclient/model/Annotatable.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2016 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package com.openshift.restclient.model; + +import java.util.Map; + +public interface Annotatable { + + /** + * Returns true if the resource is annotated with + * the given key + * @param key + * @return true if the annotation key exists + */ + boolean isAnnotatedWith(String key); + + /** + * Retrieves the annotated value for the given key + * @param key + * @return + */ + String getAnnotation(String key); + + /** + * Set the resource annotation + * @param key + * @param value + */ + void setAnnotation(String key, String value); + + /** + * Retrieves the annotations associated with the resource + * @return + */ + Map getAnnotations(); + +} diff --git a/src/main/java/com/openshift/restclient/model/IBuildConfig.java b/src/main/java/com/openshift/restclient/model/IBuildConfig.java index e4f906dd..07d01754 100644 --- a/src/main/java/com/openshift/restclient/model/IBuildConfig.java +++ b/src/main/java/com/openshift/restclient/model/IBuildConfig.java @@ -18,7 +18,14 @@ * @author Jeff Cantrill */ public interface IBuildConfig extends IResource { - + + /** + * To defines an optional location to push the output of this build to. + * Kind must be one of 'ImageStreamTag' or 'DockerImage'. + * @return + */ + IObjectReference getBuildOutputReference(); + /** * Returns the source URL for a build * @return diff --git a/src/main/java/com/openshift/restclient/model/IImageStream.java b/src/main/java/com/openshift/restclient/model/IImageStream.java index c125b699..444f451b 100644 --- a/src/main/java/com/openshift/restclient/model/IImageStream.java +++ b/src/main/java/com/openshift/restclient/model/IImageStream.java @@ -8,7 +8,10 @@ ******************************************************************************/ package com.openshift.restclient.model; +import java.util.Collection; + import com.openshift.restclient.images.DockerImageURI; +import com.openshift.restclient.model.image.ITagReference; /** * @author Jeff Cantrill @@ -38,4 +41,17 @@ public interface IImageStream extends IResource{ * @return */ String getImageId(String tagName); + + /** + * The collection of tag references for this imagestream + * @return + */ + Collection getTags(); + + /** + * The collection of tag names as listed + * in status.tags + * @return + */ + Collection getTagNames(); } diff --git a/src/main/java/com/openshift/restclient/model/IResource.java b/src/main/java/com/openshift/restclient/model/IResource.java index cccb3717..5c258292 100644 --- a/src/main/java/com/openshift/restclient/model/IResource.java +++ b/src/main/java/com/openshift/restclient/model/IResource.java @@ -19,7 +19,7 @@ * * @author Jeff Cantrill */ -public interface IResource extends ICapable { +public interface IResource extends ICapable, Annotatable { Map getMetadata(); @@ -80,34 +80,6 @@ public interface IResource extends ICapable { */ void addLabel(String key, String value); - /** - * Returns true if the resource is annotated with - * the given key - * @param key - * @return true if the annotation key exists - */ - boolean isAnnotatedWith(String key); - - /** - * Retrieves the annotated value for the given key - * @param key - * @return - */ - String getAnnotation(String key); - - /** - * Set the resource annotation - * @param key - * @param value - */ - void setAnnotation(String key, String value); - - /** - * Retrieves the annotations associated with the resource - * @return - */ - Map getAnnotations(); - String getResourceVersion(); /** diff --git a/src/main/java/com/openshift/restclient/model/image/ITagReference.java b/src/main/java/com/openshift/restclient/model/image/ITagReference.java new file mode 100644 index 00000000..41490743 --- /dev/null +++ b/src/main/java/com/openshift/restclient/model/image/ITagReference.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2016 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package com.openshift.restclient.model.image; + +import com.openshift.restclient.model.Annotatable; +import com.openshift.restclient.model.IObjectReference; + +public interface ITagReference extends Annotatable { + + /** + * Returns the identifier for this reference + * @return + */ + String getName(); + + /** + * if specified, a reference to another image that this tag should point to. + * Valid values are ImageStreamTag, ImageStreamImage, and DockerImage. + * @return + */ + IObjectReference getFrom(); + + String toJson(); +} diff --git a/src/test/java/com/openshift/internal/restclient/model/v1/ImageStreamTest.java b/src/test/java/com/openshift/internal/restclient/model/v1/ImageStreamTest.java index 185e4327..aec1fe4b 100644 --- a/src/test/java/com/openshift/internal/restclient/model/v1/ImageStreamTest.java +++ b/src/test/java/com/openshift/internal/restclient/model/v1/ImageStreamTest.java @@ -11,6 +11,9 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.mock; +import java.util.Collection; +import java.util.stream.Collectors; + import org.jboss.dmr.ModelNode; import org.junit.BeforeClass; import org.junit.Test; @@ -34,11 +37,18 @@ public class ImageStreamTest { public static void setup(){ client = mock(IClient.class); } - + + @Test + public void testGetTags() { + IImageStream stream = getImageStream(); + Collection tags = stream.getTags().stream().map(tr->tr.getName()).collect(Collectors.toList()); + assertArrayEquals(new Object [] {"8.1", "latest"}, tags.toArray()); + } + @Test public void getDockerImageRepository() { IImageStream repo = getImageStream(); - assertEquals(new DockerImageURI("172.30.244.213:5000/test/origin-ruby-sample"), repo.getDockerImageRepository()); + assertEquals(new DockerImageURI("172.30.224.48:5000/openshift/wildfly:latest"), repo.getDockerImageRepository()); } @Test diff --git a/src/test/resources/samples/openshift3/v1_image_stream.json b/src/test/resources/samples/openshift3/v1_image_stream.json index b9dfb5f1..48988048 100644 --- a/src/test/resources/samples/openshift3/v1_image_stream.json +++ b/src/test/resources/samples/openshift3/v1_image_stream.json @@ -2,21 +2,66 @@ "kind": "ImageStream", "apiVersion": "v1", "metadata": { - "name": "origin-ruby-sample", - "namespace": "test", - "selfLink": "/osapi/v1beta3/namespaces/test/imagestreams/origin-ruby-sample", - "uid": "5dfef721-0fab-11e5-9467-080027893417", - "resourceVersion": "384", - "creationTimestamp": "2015-06-10T20:00:39Z", - "labels": { - "foo": "bar", - "template": "application-template-stibuild" + "name": "wildfly", + "namespace": "openshift", + "selfLink": "/oapi/v1/namespaces/openshift/imagestreams/wildfly", + "uid": "c92f9f1b-83fb-11e5-9995-fa163e0f2c20", + "resourceVersion": "2072", + "creationTimestamp": "2015-11-05T20:28:34Z", + "annotations": { + "openshift.io/image.dockerRepositoryCheck": "2015-11-05T20:28:54Z" } }, "spec": { - "dockerImageRepository": "172.30.244.213:5000/test/origin-ruby-sample" + "tags": [ + { + "name": "8.1", + "annotations": { + "description": "Build and run Java applications on Wildfly 8.1", + "iconClass": "icon-wildfly", + "sampleRepo": "https://github.com/bparees/openshift-jee-sample.git", + "supports": "wildfly:8.1,jee,java", + "tags": "builder,wildfly,java", + "version": "8.1" + }, + "from": { + "kind": "DockerImage", + "name": "openshift/wildfly-81-centos7:latest" + } + }, + { + "name": "latest", + "from": { + "kind": "ImageStreamTag", + "name": "8.1" + } + } + ] }, "status": { - "dockerImageRepository": "172.30.244.213:5000/test/origin-ruby-sample" + "dockerImageRepository": "172.30.224.48:5000/openshift/wildfly", + "tags": [ + { + "tag": "8.1", + "items": [ + { + "created": "2015-11-05T20:28:54Z", + "dockerImageReference": "docker.io/openshift/wildfly-81-centos7@sha256:7e4c604e6ffad326607461165ef2f23dff5158e0249a3d4f7c0ef3eea58b1d2f", + "image": "sha256:7e4c604e6ffad326607461165ef2f23dff5158e0249a3d4f7c0ef3eea58b1d2f" + } + ] + }, + { + "tag": "latest", + "items": [ + { + "created": "2015-11-05T20:28:54Z", + "dockerImageReference": "docker.io/openshift/wildfly-81-centos7@sha256:7e4c604e6ffad326607461165ef2f23dff5158e0249a3d4f7c0ef3eea58b1d2f", + "image": "sha256:7e4c604e6ffad326607461165ef2f23dff5158e0249a3d4f7c0ef3eea58b1d2f" + } + ] + } + ] } -} \ No newline at end of file +} +