问题描述
借助以下代码,我为 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);
如何获取现有策略、迭代它们并更新其中之一 如果需要使用 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();