package com.microsoft.azure.management.containerregistry.implementation;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.containerregistry.AgentProperties;
import com.microsoft.azure.management.containerregistry.Architecture;
import com.microsoft.azure.management.containerregistry.BaseImageTrigger;
import com.microsoft.azure.management.containerregistry.BaseImageTriggerType;
import com.microsoft.azure.management.containerregistry.BaseImageTriggerUpdateParameters;
import com.microsoft.azure.management.containerregistry.DockerBuildStepUpdateParameters;
import com.microsoft.azure.management.containerregistry.DockerTaskStep;
import com.microsoft.azure.management.containerregistry.EncodedTaskStep;
import com.microsoft.azure.management.containerregistry.EncodedTaskStepUpdateParameters;
import com.microsoft.azure.management.containerregistry.FileTaskStep;
import com.microsoft.azure.management.containerregistry.FileTaskStepUpdateParameters;
import com.microsoft.azure.management.containerregistry.OS;
import com.microsoft.azure.management.containerregistry.PlatformProperties;
import com.microsoft.azure.management.containerregistry.PlatformUpdateParameters;
import com.microsoft.azure.management.containerregistry.ProvisioningState;
import com.microsoft.azure.management.containerregistry.RegistryDockerTaskStep;
import com.microsoft.azure.management.containerregistry.RegistryEncodedTaskStep;
import com.microsoft.azure.management.containerregistry.RegistryFileTaskStep;
import com.microsoft.azure.management.containerregistry.RegistrySourceTrigger;
import com.microsoft.azure.management.containerregistry.RegistryTask;
import com.microsoft.azure.management.containerregistry.RegistryTaskStep;
import com.microsoft.azure.management.containerregistry.SourceProperties;
import com.microsoft.azure.management.containerregistry.SourceTrigger;
import com.microsoft.azure.management.containerregistry.SourceTriggerUpdateParameters;
import com.microsoft.azure.management.containerregistry.SourceUpdateParameters;
import com.microsoft.azure.management.containerregistry.TaskStatus;
import com.microsoft.azure.management.containerregistry.TaskUpdateParameters;
import com.microsoft.azure.management.containerregistry.TriggerProperties;
import com.microsoft.azure.management.containerregistry.TriggerStatus;
import com.microsoft.azure.management.containerregistry.TriggerUpdateParameters;
import com.microsoft.azure.management.containerregistry.Variant;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.resources.fluentcore.arm.ResourceUtils;
import com.microsoft.azure.management.resources.fluentcore.model.Indexable;
import com.microsoft.azure.management.resources.fluentcore.utils.Utils;
import com.microsoft.rest.ServiceCallback;
import com.microsoft.rest.ServiceFuture;
import org.joda.time.DateTime;
import rx.Observable;
import rx.functions.Func1;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@LangDefinition
class RegistryTaskImpl implements
RegistryTask,
RegistryTask.Definition,
RegistryTask.Update {
private final TasksInner tasksInner;
private final String taskName;
private final String key = UUID.randomUUID().toString();
private String resourceGroupName;
private String registryName;
private TaskInner inner;
TaskUpdateParameters taskUpdateParameters;
private RegistryTaskStep registryTaskStep;
@Override
public String id() {
return this.inner().id();
}
@Override
public String name() {
return this.inner().name();
}
@Override
public String type() {
return this.inner().type();
}
@Override
public String regionName() {
return this.inner().location();
}
@Override
public Region region() {
return Region.fromName(this.regionName());
}
@Override
public Map<String, String> tags() {
return this.inner().getTags();
}
@Override
public String resourceGroupName() {
return ResourceUtils.groupFromResourceId(this.id());
}
@Override
public String parentRegistryId() {
return ResourceUtils.parentResourceIdFromResourceId(this.id());
}
@Override
public ProvisioningState provisioningState() {
return this.inner.provisioningState();
}
@Override
public DateTime creationDate() {
return this.inner.creationDate();
}
@Override
public TaskStatus status() {
return this.inner.status();
}
@Override
public TaskInner inner() {
return this.inner;
}
@Override
public String key() {
return this.key;
}
@Override
public RegistryTaskStep registryTaskStep() {
if (this.registryTaskStep != null) {
return this.registryTaskStep;
}
if (this.inner.step() instanceof FileTaskStep) {
this.registryTaskStep = new RegistryFileTaskStepImpl(this);
} else if (this.inner.step() instanceof EncodedTaskStep) {
this.registryTaskStep = new RegistryEncodedTaskStepImpl(this);
} else if (this.inner.step() instanceof DockerTaskStep) {
this.registryTaskStep = new RegistryDockerTaskStepImpl(this);
}
return this.registryTaskStep;
}
@Override
public int timeout() {
return Utils.toPrimitiveInt(this.inner.timeout());
}
@Override
public PlatformProperties platform() {
return this.inner.platform();
}
@Override
public int cpuCount() {
if (this.inner.agentConfiguration() == null) {
return 0;
}
return Utils.toPrimitiveInt(this.inner.agentConfiguration().cpu());
}
@Override
public TriggerProperties trigger() {
return this.inner.trigger();
}
@Override
public Map<String, RegistrySourceTrigger> sourceTriggers() {
Map<String, RegistrySourceTrigger> sourceTriggerMap = new HashMap<String, RegistrySourceTrigger>();
for (SourceTrigger sourceTrigger : this.inner.trigger().sourceTriggers()) {
sourceTriggerMap.put(sourceTrigger.name(), new RegistrySourceTriggerImpl(sourceTrigger.name(), this, false));
}
return sourceTriggerMap;
}
RegistryTaskImpl(ContainerRegistryManager registryManager, String taskName) {
this.tasksInner = registryManager.inner().tasks();
this.taskName = taskName;
this.inner = new TaskInner();
this.taskUpdateParameters = new TaskUpdateParameters();
}
RegistryTaskImpl(ContainerRegistryManager registryManager, TaskInner inner) {
this.tasksInner = registryManager.inner().tasks();
this.taskName = inner.name();
this.inner = inner;
this.resourceGroupName = ResourceUtils.groupFromResourceId(this.inner.id());
this.registryName = ResourceUtils.nameFromResourceId(ResourceUtils.parentResourceIdFromResourceId(this.inner.id()));
this.taskUpdateParameters = new TaskUpdateParameters();
setTaskUpdateParameterTriggers();
}
@Override
public DefinitionStages.Location withExistingRegistry(String resourceGroupName, String registryName) {
this.resourceGroupName = resourceGroupName;
this.registryName = registryName;
return this;
}
@Override
public RegistryFileTaskStep.DefinitionStages.Blank defineFileTaskStep() {
return new RegistryFileTaskStepImpl(this);
}
@Override
public RegistryEncodedTaskStep.DefinitionStages.Blank defineEncodedTaskStep() {
return new RegistryEncodedTaskStepImpl(this);
}
@Override
public RegistryDockerTaskStep.DefinitionStages.Blank defineDockerTaskStep() {
return new RegistryDockerTaskStepImpl(this);
}
@Override
public DefinitionStages.Platform withLocation(String location) {
this.inner.withLocation(location);
return this;
}
@Override
public DefinitionStages.Platform withLocation(Region location) {
this.inner.withLocation(location.toString());
return this;
}
@Override
public RegistryTaskImpl withLinux() {
if (isInCreateMode()) {
if (this.inner.platform() == null) {
this.inner.withPlatform(new PlatformProperties());
}
this.inner.platform().withOs(OS.LINUX);
} else {
if (this.taskUpdateParameters.platform() == null) {
this.taskUpdateParameters.withPlatform(new PlatformUpdateParameters());
}
this.taskUpdateParameters.platform().withOs(OS.LINUX);
}
return this;
}
@Override
public RegistryTaskImpl withWindows() {
if (isInCreateMode()) {
if (this.inner.platform() == null) {
this.inner.withPlatform(new PlatformProperties());
}
this.inner.platform().withOs(OS.WINDOWS);
} else {
if (this.taskUpdateParameters.platform() == null) {
this.taskUpdateParameters.withPlatform(new PlatformUpdateParameters());
}
this.taskUpdateParameters.platform().withOs(OS.WINDOWS);
}
return this;
}
@Override
public RegistryTaskImpl withLinux(Architecture architecture) {
if (isInCreateMode()) {
if (this.inner.platform() == null) {
this.inner.withPlatform(new PlatformProperties());
}
this.inner.platform().withOs(OS.LINUX).withArchitecture(architecture);
} else {
if (this.taskUpdateParameters.platform() == null) {
this.taskUpdateParameters.withPlatform(new PlatformUpdateParameters());
}
this.taskUpdateParameters.platform().withOs(OS.LINUX).withArchitecture(architecture);
}
return this;
}
@Override
public RegistryTaskImpl withWindows(Architecture architecture) {
if (isInCreateMode()) {
if (this.inner.platform() == null) {
this.inner.withPlatform(new PlatformProperties());
}
this.inner.platform().withOs(OS.WINDOWS).withArchitecture(architecture);
} else {
if (this.taskUpdateParameters.platform() == null) {
this.taskUpdateParameters.withPlatform(new PlatformUpdateParameters());
}
this.taskUpdateParameters.platform().withOs(OS.WINDOWS).withArchitecture(architecture);
}
return this;
}
@Override
public RegistryTaskImpl withLinux(Architecture architecture, Variant variant) {
if (isInCreateMode()) {
if (this.inner.platform() == null) {
this.inner.withPlatform(new PlatformProperties());
}
this.inner.platform().withOs(OS.LINUX).withArchitecture(architecture).withVariant(variant);
} else {
if (this.taskUpdateParameters.platform() == null) {
this.taskUpdateParameters.withPlatform(new PlatformUpdateParameters());
}
this.taskUpdateParameters.platform().withOs(OS.LINUX).withArchitecture(architecture).withVariant(variant);
}
return this;
}
@Override
public RegistryTaskImpl withWindows(Architecture architecture, Variant variant) {
if (isInCreateMode()) {
if (this.inner.platform() == null) {
this.inner.withPlatform(new PlatformProperties());
}
this.inner.platform().withOs(OS.WINDOWS).withArchitecture(architecture).withVariant(variant);
} else {
if (this.taskUpdateParameters.platform() == null) {
this.taskUpdateParameters.withPlatform(new PlatformUpdateParameters());
}
this.taskUpdateParameters.platform().withOs(OS.WINDOWS).withArchitecture(architecture).withVariant(variant);
}
return this;
}
@Override
public RegistryTaskImpl withPlatform(PlatformProperties platformProperties) {
this.inner.withPlatform(platformProperties);
return this;
}
@Override
public RegistryTaskImpl withPlatform(PlatformUpdateParameters platformProperties) {
this.taskUpdateParameters.withPlatform(platformProperties);
return this;
}
@Override
public RegistrySourceTriggerImpl defineSourceTrigger(String sourceTriggerName) {
if (isInCreateMode()) {
if (this.inner.trigger() == null) {
this.inner.withTrigger(new TriggerProperties());
}
if (this.inner.trigger().sourceTriggers() == null) {
this.inner.trigger().withSourceTriggers(new ArrayList<SourceTrigger>());
}
return new RegistrySourceTriggerImpl(sourceTriggerName, this, true);
} else {
this.taskUpdateParameters = new TaskUpdateParameters();
this.setTaskUpdateParameterTriggers();
return new RegistrySourceTriggerImpl(sourceTriggerName, this, true);
}
}
@Override
public DefinitionStages.TaskCreatable withBaseImageTrigger(String baseImageTriggerName, BaseImageTriggerType baseImageTriggerType) {
if (this.inner.trigger() == null) {
this.inner.withTrigger(new TriggerProperties());
}
this.inner.trigger().withBaseImageTrigger(new BaseImageTrigger()
.withBaseImageTriggerType(baseImageTriggerType)
.withName(baseImageTriggerName));
return this;
}
@Override
public DefinitionStages.TaskCreatable withBaseImageTrigger(String baseImageTriggerName, BaseImageTriggerType baseImageTriggerType, TriggerStatus triggerStatus) {
if (this.inner.trigger() == null) {
this.inner.withTrigger(new TriggerProperties());
}
this.inner.trigger().withBaseImageTrigger(new BaseImageTrigger()
.withBaseImageTriggerType(baseImageTriggerType)
.withName(baseImageTriggerName)
.withStatus(triggerStatus));
return this;
}
@Override
public RegistryTaskImpl withCpuCount(int count) {
if (isInCreateMode()) {
if (this.inner.agentConfiguration() == null) {
this.inner.withAgentConfiguration(new AgentProperties());
}
this.inner.agentConfiguration().withCpu(count);
} else {
if (this.taskUpdateParameters.agentConfiguration() == null) {
this.taskUpdateParameters.withAgentConfiguration(new AgentProperties());
}
this.taskUpdateParameters.agentConfiguration().withCpu(count);
}
return this;
}
@Override
public RegistryTaskImpl withTimeout(int timeout) {
if (isInCreateMode()) {
this.inner.withTimeout(timeout);
} else {
this.taskUpdateParameters.withTimeout(timeout);
}
return this;
}
@Override
public RegistryTask create() {
return (RegistryTask) createAsync().toBlocking().last();
}
@Override
public ServiceFuture<RegistryTask> createAsync(ServiceCallback<RegistryTask> callback) {
return ServiceFuture.fromBody(createAsync().map(new Func1<Indexable, RegistryTask>() {
@Override
public RegistryTask call(Indexable indexable) {
return (RegistryTask) indexable;
}
}), callback);
}
@Override
public Observable<Indexable> createAsync() {
final RegistryTaskImpl self = this;
return this.tasksInner.createAsync(this.resourceGroupName, this.registryName, this.taskName, this.inner).map(new Func1<TaskInner, Indexable>() {
@Override
public Indexable call(TaskInner taskInner) {
self.inner = taskInner;
self.taskUpdateParameters = new TaskUpdateParameters();
self.setTaskUpdateParameterTriggers();
return self;
}
});
}
@Override
public RegistryTask refresh() {
return refreshAsync().toBlocking().last();
}
@Override
public Observable<RegistryTask> refreshAsync() {
final RegistryTaskImpl self = this;
return this.tasksInner.getAsync(this.resourceGroupName, this.registryName, this.taskName).map(new Func1<TaskInner, RegistryTask>() {
@Override
public RegistryTask call(TaskInner taskInner) {
self.inner = taskInner;
self.taskUpdateParameters = new TaskUpdateParameters();
self.setTaskUpdateParameterTriggers();
return self;
}
});
}
@Override
public RegistryFileTaskStep.Update updateFileTaskStep() {
if (!(this.inner.step() instanceof FileTaskStep)) {
throw new UnsupportedOperationException("Calling updateFileTaskStep on a RegistryTask that is of type " + this.inner.step().getClass().getName() + ".");
}
return new RegistryFileTaskStepImpl(this);
}
@Override
public RegistryEncodedTaskStep.Update updateEncodedTaskStep() {
if (!(this.inner.step() instanceof EncodedTaskStep)) {
throw new UnsupportedOperationException("Calling updateEncodedTaskStep on a RegistryTask that is of type " + this.inner.step().getClass().getName() + ".");
}
return new RegistryEncodedTaskStepImpl(this);
}
@Override
public RegistryDockerTaskStep.Update updateDockerTaskStep() {
if (!(this.inner.step() instanceof DockerTaskStep)) {
throw new UnsupportedOperationException("Calling updateDockerTaskStep on a RegistryTask that is of type " + this.inner.step().getClass().getName() + ".");
}
return new RegistryDockerTaskStepImpl(this);
}
@Override
public RegistrySourceTrigger.Update updateSourceTrigger(String sourceTriggerName) {
return new RegistrySourceTriggerImpl(sourceTriggerName, this, false);
}
@Override
public Update updateBaseImageTrigger(String baseImageTriggerName, BaseImageTriggerType baseImageTriggerType) {
this.taskUpdateParameters.trigger().withBaseImageTrigger(new BaseImageTriggerUpdateParameters()
.withBaseImageTriggerType(baseImageTriggerType)
.withName(baseImageTriggerName));
return this;
}
@Override
public Update updateBaseImageTrigger(String baseImageTriggerName, BaseImageTriggerType baseImageTriggerType, TriggerStatus triggerStatus) {
this.taskUpdateParameters.trigger().withBaseImageTrigger(new BaseImageTriggerUpdateParameters()
.withBaseImageTriggerType(baseImageTriggerType)
.withName(baseImageTriggerName)
.withStatus(triggerStatus));
return this;
}
@Override
public Update update() {
return this;
}
@Override
public RegistryTask apply() {
return applyAsync().toBlocking().last();
}
@Override
public Observable<RegistryTask> applyAsync() {
final RegistryTaskImpl self = this;
return this.tasksInner.updateAsync(this.resourceGroupName, this.registryName, this.taskName, this.taskUpdateParameters).map(new Func1<TaskInner, RegistryTask>() {
@Override
public RegistryTask call(TaskInner taskInner) {
self.inner = taskInner;
self.taskUpdateParameters = new TaskUpdateParameters();
self.registryTaskStep = null;
self.taskUpdateParameters = new TaskUpdateParameters();
self.setTaskUpdateParameterTriggers();
return self;
}
});
}
@Override
public ServiceFuture<RegistryTask> applyAsync(ServiceCallback<RegistryTask> callback) {
return ServiceFuture.fromBody(applyAsync(), callback);
}
private boolean isInCreateMode() {
if (this.inner().id() == null) {
return true;
}
return false;
}
void withFileTaskStepCreateParameters(FileTaskStep fileTaskStep) {
this.inner.withStep(fileTaskStep);
}
void withFileTaskStepUpdateParameters(FileTaskStepUpdateParameters fileTaskStepUpdateParameters) {
this.taskUpdateParameters.withStep(fileTaskStepUpdateParameters);
}
void withEncodedTaskStepCreateParameters(EncodedTaskStep encodedTaskStep) {
this.inner.withStep(encodedTaskStep);
}
void withEncodedTaskStepUpdateParameters(EncodedTaskStepUpdateParameters encodedTaskStepUpdateParameters) {
this.taskUpdateParameters.withStep(encodedTaskStepUpdateParameters);
}
void withDockerTaskStepCreateParameters(DockerTaskStep dockerTaskStep) {
this.inner.withStep(dockerTaskStep);
}
void withDockerTaskStepUpdateParameters(DockerBuildStepUpdateParameters dockerTaskStepUpdateParameters) {
this.taskUpdateParameters.withStep(dockerTaskStepUpdateParameters);
}
void withSourceTriggerCreateParameters(SourceTrigger sourceTrigger) {
List<SourceTrigger> sourceTriggers = this.inner.trigger().sourceTriggers();
sourceTriggers.add(sourceTrigger);
this.inner.trigger().withSourceTriggers(sourceTriggers);
}
void withSourceTriggerUpdateParameters(SourceTriggerUpdateParameters sourceTriggerUpdateParameters) {
List<SourceTriggerUpdateParameters> sourceTriggerUpdateParametersList = this.taskUpdateParameters.trigger().sourceTriggers();
sourceTriggerUpdateParametersList.add(sourceTriggerUpdateParameters);
this.taskUpdateParameters.trigger().withSourceTriggers(sourceTriggerUpdateParametersList);
}
void setTaskUpdateParameterTriggers() {
if (this.taskUpdateParameters.trigger() == null) {
this.taskUpdateParameters.withTrigger(new TriggerUpdateParameters());
}
if (this.inner.trigger() == null) {
return;
}
if (this.inner.trigger().sourceTriggers() != null) {
List<SourceTriggerUpdateParameters> sourceTriggerUpdateParameters = new ArrayList<SourceTriggerUpdateParameters>();
for (SourceTrigger sourceTrigger : this.inner.trigger().sourceTriggers()) {
sourceTriggerUpdateParameters.add(sourceTriggerToSourceTriggerUpdateParameters(sourceTrigger));
}
this.taskUpdateParameters.trigger().withSourceTriggers(sourceTriggerUpdateParameters);
}
if (this.inner.trigger().baseImageTrigger() != null) {
this.taskUpdateParameters.trigger().withBaseImageTrigger(setTaskUpdateParameterBaseImageTrigger());
}
}
BaseImageTriggerUpdateParameters setTaskUpdateParameterBaseImageTrigger() {
BaseImageTriggerUpdateParameters baseImageTriggerUpdateParameters = new BaseImageTriggerUpdateParameters();
baseImageTriggerUpdateParameters.withName(this.inner.trigger().baseImageTrigger().name());
baseImageTriggerUpdateParameters.withBaseImageTriggerType(this.inner.trigger().baseImageTrigger().baseImageTriggerType());
baseImageTriggerUpdateParameters.withStatus(this.inner.trigger().baseImageTrigger().status());
return baseImageTriggerUpdateParameters;
}
SourceTriggerUpdateParameters sourceTriggerToSourceTriggerUpdateParameters(SourceTrigger sourceTrigger) {
SourceTriggerUpdateParameters sourceTriggerUpdateParameters = new SourceTriggerUpdateParameters();
sourceTriggerUpdateParameters.withName(sourceTrigger.name());
sourceTriggerUpdateParameters.withSourceRepository(sourcePropertiesToSourceUpdateParameters(sourceTrigger.sourceRepository()));
sourceTriggerUpdateParameters.withStatus(sourceTrigger.status());
sourceTriggerUpdateParameters.withSourceTriggerEvents(sourceTrigger.sourceTriggerEvents());
return sourceTriggerUpdateParameters;
}
SourceUpdateParameters sourcePropertiesToSourceUpdateParameters(SourceProperties sourceProperties) {
SourceUpdateParameters sourceUpdateParameters = new SourceUpdateParameters();
sourceUpdateParameters.withSourceControlType(sourceProperties.sourceControlType());
sourceUpdateParameters.withRepositoryUrl(sourceProperties.repositoryUrl());
sourceUpdateParameters.withBranch(sourceProperties.branch());
sourceUpdateParameters.withSourceControlAuthProperties(null);
return sourceUpdateParameters;
}
}