Skip to content

Commit

Permalink
mgmt, appservice redegisn (#14890)
Browse files Browse the repository at this point in the history
* bump netty version

* add WebSiteBase

* redesign WebApps.List

* FunctionAppBasic

* add test case for WebAppBasic

* add WebDeploymentSlotBasic and FunctionDeploymentSlotBasic

* simplify FunctionRuntimeStack

* changelog

* add test for batch flux

* delete ReactorMapper
  • Loading branch information
weidongxu-microsoft authored Sep 11, 2020
1 parent 6af7b5e commit 0e694ed
Show file tree
Hide file tree
Showing 47 changed files with 4,558 additions and 2,775 deletions.
2 changes: 1 addition & 1 deletion sdk/resourcemanager/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Azure Management Libraries require a `TokenCredential` implementation for authen
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-core-http-netty</artifactId>
<version>1.5.4</version>
<version>1.6.0</version>
</dependency>
```
[//]: # ({x-version-update-end})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## 2.0.0-beta.5 (Unreleased)

- Changed return type of `list` and `listByResourceGroup` in `WebApps`, `FunctionApps`, `DeploymentSlots`, `FunctionDeploymentSlots`.
- Added site properties for `WebApp`, `FunctionApp`, `DeploymentSlot`, `FunctionDeploymentSlot`.

## 2.0.0-beta.4 (2020-09-02)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
import com.azure.resourcemanager.appservice.models.DeploymentSlot;
import com.azure.resourcemanager.appservice.models.DeploymentSlots;
import com.azure.resourcemanager.appservice.models.WebApp;
import com.azure.resourcemanager.appservice.models.WebDeploymentSlotBasic;
import com.azure.resourcemanager.resources.fluentcore.arm.collection.implementation.IndependentChildResourcesImpl;
import com.azure.resourcemanager.resources.fluentcore.utils.PagedConverter;
import reactor.core.publisher.Mono;

/** The implementation DeploymentSlots. */
Expand Down Expand Up @@ -43,26 +43,6 @@ protected DeploymentSlotImpl wrapModel(SiteInner inner) {
return wrapModel(inner, null, null);
}

@Override
protected PagedFlux<DeploymentSlot> wrapPageAsync(PagedFlux<SiteInner> innerPage) {
return PagedConverter
.flatMapPage(
innerPage,
siteInner ->
Mono
.zip(
this
.inner()
.getConfigurationSlotAsync(
siteInner.resourceGroup(), parent.name(), siteInner.name().replaceAll(".*/", "")),
this
.inner()
.getDiagnosticLogsConfigurationSlotAsync(
siteInner.resourceGroup(), parent.name(), siteInner.name().replaceAll(".*/", "")),
(siteConfigResourceInner, logsConfigInner) ->
this.wrapModel(siteInner, siteConfigResourceInner, logsConfigInner)));
}

@Override
public DeploymentSlotImpl define(String name) {
return wrapModel(name);
Expand Down Expand Up @@ -106,8 +86,8 @@ public Mono<Void> deleteByNameAsync(String name) {
}

@Override
public PagedIterable<DeploymentSlot> list() {
return listByParent(parent.resourceGroupName(), parent.name());
public PagedIterable<WebDeploymentSlotBasic> list() {
return new PagedIterable<>(this.listAsync());
}

@Override
Expand All @@ -126,8 +106,9 @@ public WebApp parent() {
}

@Override
public PagedFlux<DeploymentSlot> listAsync() {
return wrapPageAsync(innerCollection.listSlotsAsync(parent.resourceGroupName(), parent.name()));
public PagedFlux<WebDeploymentSlotBasic> listAsync() {
return innerCollection.listSlotsAsync(parent.resourceGroupName(), parent.name())
.mapPage(inner -> new WebDeploymentSlotBasicImpl(inner, parent));
}

private DeploymentSlotImpl wrapModel(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.resourcemanager.appservice.implementation;

import com.azure.resourcemanager.appservice.AppServiceManager;
import com.azure.resourcemanager.appservice.fluent.inner.SiteInner;
import com.azure.resourcemanager.appservice.models.FunctionApp;
import com.azure.resourcemanager.appservice.models.FunctionAppBasic;
import com.azure.resourcemanager.resources.fluentcore.arm.models.HasManager;
import reactor.core.publisher.Mono;

class FunctionAppBasicImpl extends WebSiteBaseImpl implements FunctionAppBasic, HasManager<AppServiceManager> {

private final AppServiceManager myManager;

FunctionAppBasicImpl(SiteInner innerObject, AppServiceManager myManager) {
super(innerObject);
this.myManager = myManager;
}

@Override
public FunctionApp refresh() {
return this.refreshAsync().block();
}

@Override
public Mono<FunctionApp> refreshAsync() {
return this.manager().functionApps().getByIdAsync(this.id())
.doOnNext(site -> this.setInner(site.inner()));
}

@Override
public AppServiceManager manager() {
return myManager;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.azure.core.http.HttpPipeline;
import com.azure.core.http.HttpPipelineBuilder;
import com.azure.core.http.policy.HttpPipelinePolicy;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.RestProxy;
import com.azure.core.management.exception.ManagementException;
import com.azure.core.management.serializer.AzureJacksonAdapter;
Expand All @@ -31,6 +32,7 @@
import com.azure.resourcemanager.appservice.models.FunctionApp;
import com.azure.resourcemanager.appservice.models.FunctionAuthenticationPolicy;
import com.azure.resourcemanager.appservice.models.FunctionDeploymentSlots;
import com.azure.resourcemanager.appservice.models.FunctionEnvelope;
import com.azure.resourcemanager.appservice.models.FunctionRuntimeStack;
import com.azure.resourcemanager.appservice.models.NameValuePair;
import com.azure.resourcemanager.appservice.models.OperatingSystem;
Expand All @@ -57,7 +59,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/** The implementation for FunctionApp. */
class FunctionAppImpl
Expand Down Expand Up @@ -86,10 +87,6 @@ class FunctionAppImpl
private FunctionService functionService;
private FunctionDeploymentSlots deploymentSlots;

private Function<AppServicePlan, SiteConfigResourceInner> linuxFxVersionSetter = null;
private Mono<AppServicePlan> cachedAppServicePlanObservable =
null; // potentially shared between submitSiteConfig and submitAppSettings

private String functionAppKeyServiceHost;
private String functionServiceHost;

Expand Down Expand Up @@ -179,18 +176,6 @@ public FunctionAppImpl withLatestRuntimeVersion() {
return withRuntimeVersion("latest");
}

@Override
Mono<Indexable> submitSiteConfig() {
if (linuxFxVersionSetter != null) {
cachedAppServicePlanObservable = this.cachedAppServicePlanObservable(); // first usage, so get a new one
return cachedAppServicePlanObservable
.map(linuxFxVersionSetter)
.flatMap(ignored -> FunctionAppImpl.super.submitSiteConfig());
} else {
return super.submitSiteConfig();
}
}

@Override
Mono<Indexable> submitAppSettings() {
if (storageAccountCreatable != null && this.taskResult(storageAccountCreatable.key()) != null) {
Expand All @@ -199,16 +184,13 @@ Mono<Indexable> submitAppSettings() {
if (storageAccountToSet == null) {
return super.submitAppSettings();
} else {
if (cachedAppServicePlanObservable == null) {
cachedAppServicePlanObservable = this.cachedAppServicePlanObservable();
}
return Flux
.concat(
storageAccountToSet
.getKeysAsync()
.map(storageAccountKeys -> storageAccountKeys.get(0))
.zipWith(
cachedAppServicePlanObservable,
this.manager().appServicePlans().getByIdAsync(this.appServicePlanId()),
(StorageAccountKey storageAccountKey, AppServicePlan appServicePlan) -> {
String connectionString = com.azure.resourcemanager.resources.fluentcore.utils.Utils
.getStorageConnectionString(storageAccountToSet.name(), storageAccountKey.value(),
Expand All @@ -235,7 +217,6 @@ Mono<Indexable> submitAppSettings() {
currentStorageAccount = storageAccountToSet;
storageAccountToSet = null;
storageAccountCreatable = null;
cachedAppServicePlanObservable = null;
return this;
}));
}
Expand Down Expand Up @@ -266,14 +247,6 @@ private static boolean isConsumptionOrPremiumAppServicePlan(PricingTier pricingT
|| SkuName.ELASTIC_PREMIUM.toString().equalsIgnoreCase(description.tier());
}

private static boolean isConsumptionPlan(PricingTier pricingTier) {
if (pricingTier == null || pricingTier.toSkuDescription() == null) {
return true;
}
SkuDescription description = pricingTier.toSkuDescription();
return SkuName.DYNAMIC.toString().equalsIgnoreCase(description.tier());
}

@Override
FunctionAppImpl withNewAppServicePlan(OperatingSystem operatingSystem, PricingTier pricingTier) {
return super.withNewAppServicePlan(operatingSystem, pricingTier).autoSetAlwaysOn(pricingTier);
Expand Down Expand Up @@ -407,15 +380,7 @@ public FunctionAppImpl withBuiltInImage(final FunctionRuntimeStack runtimeStack)
}
withRuntime(runtimeStack.runtime());
withRuntimeVersion(runtimeStack.version());
linuxFxVersionSetter =
appServicePlan -> {
if (appServicePlan == null || isConsumptionPlan(appServicePlan.pricingTier())) {
siteConfig.withLinuxFxVersion(runtimeStack.getLinuxFxVersionForConsumptionPlan());
} else {
siteConfig.withLinuxFxVersion(runtimeStack.getLinuxFxVersionForDedicatedPlan());
}
return siteConfig;
};
siteConfig.withLinuxFxVersion(runtimeStack.getLinuxFxVersion());
return this;
}

Expand All @@ -439,7 +404,6 @@ public FunctionAppImpl withPrivateRegistryImage(String imageAndTag, String serve

@Override
protected void cleanUpContainerSettings() {
linuxFxVersionSetter = null;
if (siteConfig != null && siteConfig.linuxFxVersion() != null) {
siteConfig.withLinuxFxVersion(null);
}
Expand All @@ -459,11 +423,6 @@ protected OperatingSystem appServicePlanOperatingSystem(AppServicePlan appServic
: OperatingSystem.LINUX;
}

private Mono<AppServicePlan> cachedAppServicePlanObservable() {
// it could get more than one subscriber, so hot observable + caching
return this.manager().appServicePlans().getByIdAsync(this.appServicePlanId()).cache();
}

@Override
public StorageAccount storageAccount() {
return currentStorageAccount;
Expand Down Expand Up @@ -491,6 +450,11 @@ public Mono<String> getMasterKeyAsync() {
context -> context.putAll(FluxUtil.toReactorContext(this.manager().inner().getContext())));
}

@Override
public PagedIterable<FunctionEnvelope> listFunctions() {
return this.manager().functionApps().listFunctions(resourceGroupName(), name());
}

@Override
public Map<String, String> listFunctionKeys(String functionName) {
return listFunctionKeysAsync(functionName).block();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,23 @@
import com.azure.resourcemanager.appservice.fluent.inner.SiteInner;
import com.azure.resourcemanager.appservice.fluent.inner.SiteLogsConfigInner;
import com.azure.resourcemanager.appservice.models.FunctionApp;
import com.azure.resourcemanager.appservice.models.FunctionAppBasic;
import com.azure.resourcemanager.appservice.models.FunctionApps;
import com.azure.resourcemanager.appservice.models.FunctionEnvelope;
import com.azure.resourcemanager.resources.fluentcore.arm.collection.implementation.TopLevelModifiableResourcesImpl;
import com.azure.resourcemanager.resources.fluentcore.utils.PagedConverter;
import com.azure.resourcemanager.resources.fluentcore.arm.collection.SupportsBatchDeletion;
import com.azure.resourcemanager.resources.fluentcore.arm.collection.implementation.BatchDeletionImpl;
import com.azure.resourcemanager.resources.fluentcore.arm.collection.implementation.GroupableResourcesImpl;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

/** The implementation for WebApps. */
public class FunctionAppsImpl
extends TopLevelModifiableResourcesImpl<FunctionApp, FunctionAppImpl, SiteInner, WebAppsClient, AppServiceManager>
implements FunctionApps {
extends GroupableResourcesImpl<FunctionApp, FunctionAppImpl, SiteInner, WebAppsClient, AppServiceManager>
implements FunctionApps, SupportsBatchDeletion {

public FunctionAppsImpl(final AppServiceManager manager) {
super(manager.inner().getWebApps(), manager);
Expand All @@ -44,8 +49,7 @@ public FunctionApp getByResourceGroup(String groupName, String name) {
public Mono<FunctionApp> getByResourceGroupAsync(final String groupName, final String name) {
final FunctionAppsImpl self = this;
return this
.inner()
.getByResourceGroupAsync(groupName, name)
.getInnerAsync(groupName, name)
.flatMap(
siteInner ->
Mono
Expand All @@ -56,6 +60,11 @@ public Mono<FunctionApp> getByResourceGroupAsync(final String groupName, final S
wrapModel(siteInner, siteConfigResourceInner, logsConfigInner)));
}

@Override
protected Mono<SiteInner> getInnerAsync(String resourceGroupName, String name) {
return this.inner().getByResourceGroupAsync(resourceGroupName, name);
}

@Override
public PagedIterable<FunctionEnvelope> listFunctions(String resourceGroupName, String name) {
return this
Expand Down Expand Up @@ -92,29 +101,6 @@ private FunctionAppImpl wrapModel(
return new FunctionAppImpl(inner.name(), inner, siteConfig, logConfig, this.manager());
}

@Override
protected PagedFlux<FunctionApp> wrapPageAsync(PagedFlux<SiteInner> innerPage) {
return PagedConverter
.flatMapPage(
innerPage,
siteInner -> {
if (siteInner.kind() != null
&& Arrays.asList(siteInner.kind().split(",")).contains("functionapp")) {
return Mono
.zip(
this.inner().getConfigurationAsync(siteInner.resourceGroup(), siteInner.name()),
this
.inner()
.getDiagnosticLogsConfigurationAsync(
siteInner.resourceGroup(), siteInner.name()),
(siteConfigResourceInner, logsConfigInner) ->
this.wrapModel(siteInner, siteConfigResourceInner, logsConfigInner));
} else {
return Mono.empty();
}
});
}

@Override
public FunctionAppImpl define(String name) {
return wrapModel(name);
Expand All @@ -124,4 +110,48 @@ public FunctionAppImpl define(String name) {
public Mono<Void> deleteByResourceGroupAsync(String groupName, String name) {
return this.inner().deleteAsync(groupName, name);
}

@Override
public Flux<String> deleteByIdsAsync(Collection<String> ids) {
return BatchDeletionImpl.deleteByIdsAsync(ids, this::deleteInnerAsync);
}

@Override
public Flux<String> deleteByIdsAsync(String... ids) {
return this.deleteByIdsAsync(new ArrayList<>(Arrays.asList(ids)));
}

@Override
public void deleteByIds(Collection<String> ids) {
if (ids != null && !ids.isEmpty()) {
this.deleteByIdsAsync(ids).blockLast();
}
}

@Override
public void deleteByIds(String... ids) {
this.deleteByIds(new ArrayList<>(Arrays.asList(ids)));
}

@Override
public PagedIterable<FunctionAppBasic> listByResourceGroup(String resourceGroupName) {
return new PagedIterable<>(this.listByResourceGroupAsync(resourceGroupName));
}

@Override
public PagedFlux<FunctionAppBasic> listByResourceGroupAsync(String resourceGroupName) {
return inner().listByResourceGroupAsync(resourceGroupName)
.mapPage(inner -> new FunctionAppBasicImpl(inner, this.manager()));
}

@Override
public PagedIterable<FunctionAppBasic> list() {
return new PagedIterable<>(this.listAsync());
}

@Override
public PagedFlux<FunctionAppBasic> listAsync() {
return inner().listAsync()
.mapPage(inner -> new FunctionAppBasicImpl(inner, this.manager()));
}
}
Loading

0 comments on commit 0e694ed

Please sign in to comment.