Skip to content

Commit

Permalink
Merge pull request #1728 from microsoft/andy-check-name
Browse files Browse the repository at this point in the history
[Task 1870037] add name check before creating webapp
  • Loading branch information
andxu committed Sep 2, 2021
2 parents a457ef7 + 642c9c8 commit 407f059
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.azure.core.http.policy.HttpPipelinePolicy;
import com.azure.core.management.profile.AzureProfile;
import com.azure.resourcemanager.AzureResourceManager;
import com.azure.resourcemanager.appservice.fluent.models.ResourceNameAvailabilityInner;
import com.azure.resourcemanager.appservice.models.CheckNameResourceTypes;
import com.microsoft.azure.toolkit.lib.Azure;
import com.microsoft.azure.toolkit.lib.AzureConfiguration;
import com.microsoft.azure.toolkit.lib.AzureService;
Expand All @@ -31,6 +33,7 @@
import com.microsoft.azure.toolkit.lib.auth.AzureAccount;
import com.microsoft.azure.toolkit.lib.common.cache.Cacheable;
import com.microsoft.azure.toolkit.lib.common.cache.Preload;
import com.microsoft.azure.toolkit.lib.common.entity.CheckNameAvailabilityResultEntity;
import com.microsoft.azure.toolkit.lib.common.model.Subscription;
import com.microsoft.azure.toolkit.lib.common.operation.AzureOperation;
import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -120,6 +123,14 @@ public List<IWebApp> webapps(boolean... force) {
.collect(Collectors.toList());
}

@AzureOperation(name = "appservice.check_name", params = "name", type = AzureOperation.Type.SERVICE)
public CheckNameAvailabilityResultEntity checkNameAvailability(String subscriptionId, String name) {
final AzureResourceManager azureResourceManager = getAzureResourceManager(subscriptionId);
final ResourceNameAvailabilityInner result = azureResourceManager.webApps().manager()
.serviceClient().getResourceProviders().checkNameAvailability(name, CheckNameResourceTypes.MICROSOFT_WEB_SITES);
return new CheckNameAvailabilityResultEntity(result.nameAvailable(), result.reason().toString(), result.message());
}

@Cacheable(cacheName = "appservcie/{}/webapps", key = "$sid", condition = "!(force&&force[0])")
@AzureOperation(name = "webapp.list.subscription", params = "sid", type = AzureOperation.Type.SERVICE)
private List<IWebApp> webapps(String sid, boolean... force) {
Expand All @@ -130,8 +141,8 @@ private List<IWebApp> webapps(String sid, boolean... force) {
.collect(Collectors.toList());
}

public @Nonnull
@AzureOperation(name = "webapp|runtime.list.os|version", params = {"os.getValue()", "version.getValue()"}, type = AzureOperation.Type.SERVICE)
@Nonnull
public @AzureOperation(name = "webapp|runtime.list.os|version", params = {"os.getValue()", "version.getValue()"}, type = AzureOperation.Type.SERVICE)
List<Runtime> listWebAppRuntimes(@Nonnull OperatingSystem os, @Nonnull JavaVersion version) {
return Runtime.WEBAPP_RUNTIME.stream()
.filter(runtime -> Objects.equals(os, runtime.getOperatingSystem()) && Objects.equals(version, runtime.getJavaVersion()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import com.microsoft.azure.toolkit.lib.appservice.service.IAppServicePlan;
import com.microsoft.azure.toolkit.lib.appservice.service.IWebApp;
import com.microsoft.azure.toolkit.lib.common.bundle.AzureString;
import com.microsoft.azure.toolkit.lib.common.entity.CheckNameAvailabilityResultEntity;
import com.microsoft.azure.toolkit.lib.common.exception.AzureToolkitRuntimeException;
import com.microsoft.azure.toolkit.lib.common.messager.AzureMessager;
import com.microsoft.azure.toolkit.lib.common.operation.AzureOperation;
import com.microsoft.azure.toolkit.lib.common.operation.AzureOperation.Type;
Expand Down Expand Up @@ -56,12 +58,19 @@ private List<AzureTask<?>> initTasks() {
tasks.add(new CreateResourceGroupTask(this.config.subscriptionId(), this.config.servicePlanResourceGroup(), this.config.region()));
}
final AzureString title = AzureString.format("Create new web app({0})", this.config.appName());

AzureAppService az = Azure.az(AzureAppService.class);
tasks.add(new AzureTask<>(title, () -> {
final IWebApp target = Azure.az(AzureAppService.class).subscription(config.subscriptionId())
final IWebApp target = az.subscription(config.subscriptionId())
.webapp(config.resourceGroup(), config.appName());
if (!target.exists()) {
CheckNameAvailabilityResultEntity result = az.checkNameAvailability(config.subscriptionId(), config.appName());
if (!result.isAvailable()) {
throw new AzureToolkitRuntimeException(AzureString.format("Cannot create webapp {0} due to error: {1}",
config.appName(),
result.getUnavailabilityReason()).getString());
}
return create();

}
return update(target);
}));
Expand Down Expand Up @@ -93,6 +102,7 @@ private IWebApp create() {
AzureMessager.getMessager().info(String.format(CREATE_WEB_APP_DONE, result.name()));
return result;
}

@AzureOperation(name = "webapp.update", params = {"this.config.appName()"}, type = Type.SERVICE)
private IWebApp update(final IWebApp webApp) {
AzureMessager.getMessager().info(String.format(UPDATE_WEBAPP, webApp.name()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ appservice|deployment.get.id=get Azure App Service deployment slot by id({0})
appservice|deployment.get.name|app|rg|subscription=get Azure App Service deployment slot({0}) of app({1})
appservice.get_client.subscription=get Azure App Service rest client of subscription({0})
appservice|plan.create_update=create or update Azure App Service plan ({0}) from config
appservice.check_name=check name availability for ({0})
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
import com.microsoft.azure.toolkit.lib.appservice.service.IWebApp;
import com.microsoft.azure.toolkit.lib.appservice.service.IWebAppBase;
import com.microsoft.azure.toolkit.lib.appservice.service.IWebAppDeploymentSlot;
import com.microsoft.azure.toolkit.lib.common.bundle.AzureString;
import com.microsoft.azure.toolkit.lib.common.entity.CheckNameAvailabilityResultEntity;
import com.microsoft.azure.toolkit.lib.common.exception.AzureExecutionException;
import com.microsoft.azure.toolkit.lib.common.exception.AzureToolkitRuntimeException;
import com.microsoft.azure.toolkit.lib.common.messager.AzureMessager;
import com.microsoft.azure.toolkit.lib.common.model.Region;
import org.apache.commons.collections4.CollectionUtils;
Expand Down Expand Up @@ -104,6 +107,14 @@ private IWebApp createWebApp(final IWebApp webApp, final WebAppConfig webAppConf
if (webAppConfig.getRuntime() == null) {
throw new AzureExecutionException(NO_RUNTIME_CONFIG);
}

CheckNameAvailabilityResultEntity checkNameResult = az.checkNameAvailability(webAppConfig.getSubscriptionId(), webAppConfig.getAppName());
if (!checkNameResult.isAvailable()) {
throw new AzureToolkitRuntimeException(AzureString.format("Cannot create webapp {0} due to error: {1}",
webAppConfig.getAppName(),
checkNameResult.getUnavailabilityReason()).getString());
}

getTelemetryProxy().addDefaultProperty(CREATE_NEW_WEB_APP, String.valueOf(true));
final ResourceGroup resourceGroup = getOrCreateResourceGroup(webAppConfig);
final IAppServicePlan appServicePlan = getOrCreateAppServicePlan(webAppConfig);
Expand Down

0 comments on commit 407f059

Please sign in to comment.