如何在 Java 中获取和更新 azure 生命周期规则

问题描述

借助以下代码,我为 azure 存储帐户创建了生命周期策略。

StorageManager manager = StorageManager.authenticate(credential,subId); //credentilas and subscription iD
   manager.managementPolicies()
          .define("testprefix")
          .withExistingStorageAccount(resourceGroup,storageAcc)
          .defineRule("testprefixrulenew")
          .withLifecycleRuleType()
          .withBlobTypetoFilterFor(BlobTypes.BLOCK_BLOB)
          .withPrefixToFilterFor("prefix1")
          .withDeleteActionOnBaseBlob(1)
          .attach()
          .create();

当我运行它时,存储帐户的所有现有生命周期规则都将被删除,只有新创建的生命周期规则存在。

1) 如何避免使用 java 删除 Azure 存储帐户的现有生命周期规则?

此外,当我尝试使用以下代码片段获取现有生命周期策略时。

ManagementPolicyInner managementPolicy1 =
        manager2
            .inner()
            .managementPolicies()
            .getAsync(resourceGroup,storageAcc)
            .toBlocking()
            .last();

我只能获得最后修改/创建的策略。如果我们删除“last()”,它会给出 Observable 值,所以。

2) 如何获取现有策略,迭代它们,并在需要时使用 java 更新其中之一???

解决方法

如何避免删除 azure 的现有生命周期规则 使用 java 的存储帐户?

关于这个问题,我们可以使用类com.azure.resourcemanager.storage.implementation.StorageManagementClientImpl来实现。详情请参阅here

例如

String clientId="<the service principal client id>";
        String clientSecret="<the service principal client secret>"";
        String tenant="";
        String subId="";
        AzureProfile profile = new AzureProfile(tenant,subId,AzureEnvironment.AZURE);
        TokenCredential credential = new ClientSecretCredentialBuilder()
                .clientId(clientId)
                .clientSecret(clientSecret)
                .authorityHost(profile.getEnvironment().getActiveDirectoryEndpoint())
                .tenantId(tenant)
                .build();

        StorageManagementClientImpl storageManagementClient = new StorageManagementClientBuilder()
                .pipeline(HttpPipelineProvider.buildHttpPipeline(credential,profile))
                .endpoint(profile.getEnvironment().getResourceManagerEndpoint())
                .subscriptionId(profile.getSubscriptionId())
                .buildClient();

        ManagementPolicyInner policyInner= storageManagementClient.getManagementPolicies()
                .get("andywin7","andyprivate",ManagementPolicyName.DEFAULT);

        ManagementPolicyDefinition definition = new ManagementPolicyDefinition()
                .withActions( new ManagementPolicyAction().withBaseBlob(
                        new ManagementPolicyBaseBlob().withTierToCool(
                                new DateAfterModification().withDaysAfterModificationGreaterThan(180))))
                .withFilters(new ManagementPolicyFilter().withBlobTypes(Arrays.asList("blockBlob")));

        ManagementPolicyRule newRule = new ManagementPolicyRule()
                .withName("changeTier")
                .withEnabled(true)
                .withType(RuleType.LIFECYCLE)
                .withDefinition(definition);
        policyInner.policy().rules().add(newRule);
        Response<ManagementPolicyInner>  res =storageManagementClient.getManagementPolicies().createOrUpdateWithResponse(
                "andywin7",ManagementPolicyName.DEFAULT,policyInner.policy(),Context.NONE);

enter image description here enter image description here

如何获取现有策略、迭代它们并更新其中之一 如果需要使用 java???

请参考以下代码 列表

String clientId="<the service principal client id>";
        String clientSecret="<the service principal client secret>"";
        String tenant="";
        String subId="";
        AzureProfile profile = new AzureProfile(tenant,AzureEnvironment.AZURE);
        TokenCredential credential = new ClientSecretCredentialBuilder()
                .clientId(clientId)
                .clientSecret(clientSecret)
                .authorityHost(profile.getEnvironment().getActiveDirectoryEndpoint())
                .tenantId(tenant)
                .build();

        StorageManager manager = StorageManager.authenticate(credential,profile);
        ManagementPolicy managementPolicy = manager.managementPolicies()
                .getAsync("andywin7","andyprivate")
                .block();
        ObjectMapper mapper = new ObjectMapper();

        for ( ManagementPolicyRule rule : managementPolicy.policy().rules()){

            System.out.println(mapper.writeValueAsString(rule));
        }

更新

String clientId="<the service principal client id>";
        String clientSecret="<the service principal client secret>"";
        String tenant="";
        String subId="";
        AzureProfile profile = new AzureProfile(tenant,"andyprivate")
                .block();
        managementPolicy.update()
                .updateRule("<the rule name you want to update>")
                     ... the action you want to update
                .parent()
                .withoutRule("<the rule name you do not want to update>")
                .apply();

更多详情请参考here


更新

关于如何更新现有规则,请参考fowwing代码

        StorageManager manager = StorageManager.authenticate(credential,"andyprivate")
                .block();
        ObjectMapper mapper = new ObjectMapper();

        for ( ManagementPolicyRule rule : managementPolicy.policy().rules()){
               System.out.println(mapper.writeValueAsString(rule));

               if(rule.name().equals("deleteAppend")){
                  int i= managementPolicy.policy().rules().indexOf(rule);
                   ManagementPolicyRule newRule= managementPolicy.policy().rules().get(i);
                   managementPolicy.policy().rules().remove(rule);
                   newRule.definition()
                           .actions()
                           .withBaseBlob(new ManagementPolicyBaseBlob().withDelete(new DateAfterModification().withDaysAfterModificationGreaterThan(18) ));
                   managementPolicy.policy().rules().add(newRule);
               }


        }

        managementPolicy.update()
                .withPolicy(managementPolicy.policy())
                .apply();

enter image description here