/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.microsoft.azure.management.compute.implementation;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.compute.VirtualMachine;
import com.microsoft.azure.management.compute.VirtualMachineExtension;
import com.microsoft.azure.management.resources.fluentcore.arm.ResourceUtils;
import com.microsoft.azure.management.resources.fluentcore.arm.collection.implementation.ExternalChildResourcesCachedImpl;
import rx.Observable;
import rx.functions.Action2;
import rx.functions.Func0;
import rx.functions.Func1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Represents a extension collection associated with a virtual machine.
*/
@LangDefinition
class VirtualMachineExtensionsImpl extends
ExternalChildResourcesCachedImpl<VirtualMachineExtensionImpl,
VirtualMachineExtension,
VirtualMachineExtensionInner,
VirtualMachineImpl,
VirtualMachine> {
private final VirtualMachineExtensionsInner client;
/**
* Creates new VirtualMachineExtensionsImpl.
*
* @param client the client to perform REST calls on extensions
* @param parent the parent virtual machine of the extensions
*/
VirtualMachineExtensionsImpl(VirtualMachineExtensionsInner client, VirtualMachineImpl parent) {
super(parent, "VirtualMachineExtension");
this.client = client;
this.cacheCollection();
}
/**
* @return the extension as a map indexed by name.
*/
public Map<String, VirtualMachineExtension> asMap() {
return Collections.unmodifiableMap(this.asMapAsync().toBlocking().last());
}
/**
* @return an observable emits extensions in this collection as a map indexed by name.
*/
public Observable<Map<String, VirtualMachineExtension>> asMapAsync() {
return listAsync()
.collect(new Func0<Map<String, VirtualMachineExtension>>() {
@Override
public Map<String, VirtualMachineExtension> call() {
return new HashMap<>();
}
}, new Action2<Map<String, VirtualMachineExtension>, VirtualMachineExtension>() {
@Override
public void call(Map<String, VirtualMachineExtension> map, VirtualMachineExtension extension) {
map.put(extension.name(), extension);
}
});
}
/**
* @return an observable emits extensions in this collection
*/
public Observable<VirtualMachineExtension> listAsync() {
Observable<VirtualMachineExtensionImpl> extensions = Observable.from(this.collection().values());
// Resolve reference getExtensions
//
Observable<VirtualMachineExtension> resolvedExtensionsStream = extensions
.filter(new Func1<VirtualMachineExtensionImpl, Boolean>() {
@Override
public Boolean call(VirtualMachineExtensionImpl extension) {
return extension.isReference();
}
})
.flatMap(new Func1<VirtualMachineExtensionImpl, Observable<VirtualMachineExtension>>() {
@Override
public Observable<VirtualMachineExtension> call(final VirtualMachineExtensionImpl extension) {
return client.getAsync(parent().resourceGroupName(), parent().name(), extension.name())
.map(new Func1<VirtualMachineExtensionInner, VirtualMachineExtension>() {
@Override
public VirtualMachineExtension call(VirtualMachineExtensionInner extensionInner) {
return new VirtualMachineExtensionImpl(extension.name(), parent(), extensionInner, client);
}
});
}
});
return resolvedExtensionsStream.concatWith(extensions.filter(new Func1<VirtualMachineExtensionImpl, Boolean>() {
@Override
public Boolean call(VirtualMachineExtensionImpl extension) {
return !extension.isReference();
}
}));
}
/**
* Starts an extension definition chain.
*
* @param name the reference name of the extension to be added
* @return the extension
*/
public VirtualMachineExtensionImpl define(String name) {
return this.prepareDefine(name);
}
/**
* Starts an extension update chain.
*
* @param name the reference name of the extension to be updated
* @return the extension
*/
public VirtualMachineExtensionImpl update(String name) {
return this.prepareUpdate(name);
}
/**
* Mark the extension with given name as to be removed.
*
* @param name the reference name of the extension to be removed
*/
public void remove(String name) {
this.prepareRemove(name);
}
/**
* Adds the extension to the collection.
*
* @param extension the extension
*/
public void addExtension(VirtualMachineExtensionImpl extension) {
this.addChildResource(extension);
}
@Override
protected List<VirtualMachineExtensionImpl> listChildResources() {
List<VirtualMachineExtensionImpl> childResources = new ArrayList<>();
if (parent().inner().resources() != null) {
for (VirtualMachineExtensionInner inner : parent().inner().resources()) {
if (inner.name() == null) {
inner.withLocation(parent().regionName());
childResources.add(new VirtualMachineExtensionImpl(ResourceUtils.nameFromResourceId(inner.id()),
this.parent(),
inner,
this.client));
} else {
childResources.add(new VirtualMachineExtensionImpl(inner.name(),
this.parent(),
inner,
this.client));
}
}
}
return childResources;
}
@Override
protected VirtualMachineExtensionImpl newChildResource(String name) {
VirtualMachineExtensionImpl extension = VirtualMachineExtensionImpl
.newVirtualMachineExtension(name, this.parent(), this.client);
return extension;
}
}