package com.microsoft.azure.management.network.implementation;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.network.ExpressRouteCircuitPeeringConfig;
import com.microsoft.azure.management.network.ExpressRouteCrossConnection;
import com.microsoft.azure.management.network.ExpressRouteCrossConnectionPeering;
import com.microsoft.azure.management.network.ExpressRoutePeeringState;
import com.microsoft.azure.management.network.ExpressRoutePeeringType;
import com.microsoft.azure.management.network.Ipv6ExpressRouteCircuitPeeringConfig;
import com.microsoft.azure.management.network.ProvisioningState;
import com.microsoft.azure.management.resources.fluentcore.model.implementation.CreatableUpdatableImpl;
import com.microsoft.azure.management.resources.fluentcore.utils.Utils;
import rx.Observable;
import rx.functions.Func1;
import java.util.Arrays;
@LangDefinition
class ExpressRouteCrossConnectionPeeringImpl extends
CreatableUpdatableImpl<ExpressRouteCrossConnectionPeering, ExpressRouteCrossConnectionPeeringInner, ExpressRouteCrossConnectionPeeringImpl>
implements
ExpressRouteCrossConnectionPeering,
ExpressRouteCrossConnectionPeering.Definition,
ExpressRouteCrossConnectionPeering.Update {
private final ExpressRouteCrossConnectionPeeringsInner client;
private final ExpressRouteCrossConnection parent;
ExpressRouteCrossConnectionPeeringImpl(ExpressRouteCrossConnectionImpl parent, ExpressRouteCrossConnectionPeeringInner innerObject, ExpressRoutePeeringType type) {
super(type.toString(), innerObject);
this.client = parent.manager().inner().expressRouteCrossConnectionPeerings();
this.parent = parent;
inner().withPeeringType(type);
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withAdvertisedPublicPrefixes(String publicPrefix) {
ensureMicrosoftPeeringConfig().withAdvertisedPublicPrefixes(Arrays.asList(publicPrefix));
return this;
}
private ExpressRouteCircuitPeeringConfig ensureMicrosoftPeeringConfig() {
if (inner().microsoftPeeringConfig() == null) {
inner().withMicrosoftPeeringConfig(new ExpressRouteCircuitPeeringConfig());
}
return inner().microsoftPeeringConfig();
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withPrimaryPeerAddressPrefix(String addressPrefix) {
inner().withPrimaryPeerAddressPrefix(addressPrefix);
return this;
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withSecondaryPeerAddressPrefix(String addressPrefix) {
inner().withSecondaryPeerAddressPrefix(addressPrefix);
return this;
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withVlanId(int vlanId) {
inner().withVlanId(vlanId);
return this;
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withPeerAsn(long peerAsn) {
inner().withPeerASN(peerAsn);
return this;
}
@Override
public DefinitionStages.WithCreate withSharedKey(String sharedKey) {
inner().withSharedKey(sharedKey);
return this;
}
@Override
public Ipv6PeeringConfigImpl defineIpv6Config() {
return new Ipv6PeeringConfigImpl(new Ipv6ExpressRouteCircuitPeeringConfig(), this);
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withoutIpv6Config() {
inner().withIpv6PeeringConfig(null);
return this;
}
ExpressRouteCrossConnectionPeeringImpl attachIpv6Config(Ipv6PeeringConfigImpl ipv6PeeringConfig) {
inner().withIpv6PeeringConfig(ipv6PeeringConfig.inner());
return this;
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withCustomerASN(int customerASN) {
ensureMicrosoftPeeringConfig().withCustomerASN(customerASN);
return this;
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withRoutingRegistryName(String routingRegistryName) {
ensureMicrosoftPeeringConfig().withRoutingRegistryName(routingRegistryName);
return this;
}
@Override
public ExpressRouteCrossConnectionPeeringImpl withState(ExpressRoutePeeringState state) {
inner().withState(state);
return this;
}
@Override
protected Observable<ExpressRouteCrossConnectionPeeringInner> getInnerAsync() {
return this.client.getAsync(parent.resourceGroupName(), parent.name(), name());
}
@Override
public boolean isInCreateMode() {
return this.inner().id() == null;
}
@Override
public Observable<ExpressRouteCrossConnectionPeering> createResourceAsync() {
return this.client.createOrUpdateAsync(parent.resourceGroupName(), parent.name(), this.name(), inner())
.map(new Func1<ExpressRouteCrossConnectionPeeringInner, ExpressRouteCrossConnectionPeering>() {
@Override
public ExpressRouteCrossConnectionPeering call(ExpressRouteCrossConnectionPeeringInner innerModel) {
ExpressRouteCrossConnectionPeeringImpl.this.setInner(innerModel);
parent.refresh();
return ExpressRouteCrossConnectionPeeringImpl.this;
}
});
}
@Override
public String id() {
return inner().id();
}
@Override
public NetworkManager manager() {
return parent.manager();
}
@Override
public String resourceGroupName() {
return parent.resourceGroupName();
}
@Override
public ExpressRoutePeeringType peeringType() {
return inner().peeringType();
}
@Override
public ExpressRoutePeeringState state() {
return inner().state();
}
@Override
public int azureASN() {
return Utils.toPrimitiveInt(inner().azureASN());
}
@Override
public long peerASN() {
return Utils.toPrimitiveLong(inner().peerASN());
}
@Override
public String primaryPeerAddressPrefix() {
return inner().primaryPeerAddressPrefix();
}
@Override
public String secondaryPeerAddressPrefix() {
return inner().secondaryPeerAddressPrefix();
}
@Override
public String primaryAzurePort() {
return inner().primaryAzurePort();
}
@Override
public String secondaryAzurePort() {
return inner().secondaryAzurePort();
}
@Override
public String sharedKey() {
return inner().sharedKey();
}
@Override
public int vlanId() {
return Utils.toPrimitiveInt(inner().vlanId());
}
@Override
public ExpressRouteCircuitPeeringConfig microsoftPeeringConfig() {
return inner().microsoftPeeringConfig();
}
@Override
public ProvisioningState provisioningState() {
return inner().provisioningState();
}
@Override
public String gatewayManagerEtag() {
return inner().gatewayManagerEtag();
}
@Override
public String lastModifiedBy() {
return inner().lastModifiedBy();
}
@Override
public Ipv6ExpressRouteCircuitPeeringConfig ipv6PeeringConfig() {
return inner().ipv6PeeringConfig();
}
}