Before any virtual machines can be encrypted, vCenter Server must contain an encryption storage policy. The policy only needs to be created once; it can be assigned to any virtual machines that you want to encrypt.
Java program to set storage policy for encryption
package com.vmware.spbm.samples;
import java.util.ArrayList;
import java.util.List;
import com.vmware.common.annotations.Action;
import com.vmware.common.annotations.Option;
import com.vmware.common.annotations.Sample;
import com.vmware.pbm.InvalidArgumentFaultMsg;
import com.vmware.pbm.PbmCapabilityConstraintInstance;
import com.vmware.pbm.PbmCapabilityInstance;
import com.vmware.pbm.PbmCapabilityMetadata;
import com.vmware.pbm.PbmCapabilityMetadataPerCategory;
import com.vmware.pbm.PbmCapabilityProfileCreateSpec;
import com.vmware.pbm.PbmCapabilityPropertyInstance;
import com.vmware.pbm.PbmCapabilityPropertyMetadata;
import com.vmware.pbm.PbmCapabilitySubProfile;
import com.vmware.pbm.PbmCapabilitySubProfileConstraints;
import com.vmware.pbm.PbmCapabilityVendorNamespaceInfo;
import com.vmware.pbm.PbmCapabilityVendorResourceTypeInfo;
import com.vmware.pbm.PbmDuplicateNameFaultMsg;
import com.vmware.pbm.PbmFaultProfileStorageFaultFaultMsg;
import com.vmware.pbm.PbmProfileId;
import com.vmware.pbm.PbmServiceInstanceContent;
import com.vmware.spbm.connection.ConnectedServiceBase;
import com.vmware.spbm.connection.helpers.PbmUtil;
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.RuntimeFaultFaultMsg;
/**
* CreateVMEncryptionProfile
* Create new Storage Profile with one rule-set based on vmwarevmcrypt capabilities.
* Parameters:
* vcurl [required] : web service url, for example https://10.9.8.7/sdk
* username [required] : username for the authentication
* password [required] : corresponding password
* profilename [required] : name of the storage profile
* Command Line:
* run.bat com.vmware.spbm.samples.CreateVMEncryptionProfile --vcurl [webserviceurl] ^
* --username [username] --password [password] --profilename [Storage Profile Name]
*/
@Sample(name = "CreateVMEncryptionProfile",
description = "Create a new storage profile with "
+ "one rule-set based on vmwarevmcrypt capabilities.")
public class CreateVMEncryptionProfile extends ConnectedServiceBase {
private PbmServiceInstanceContent spbmsc;
private String profileName;
// Build capability instance based on capability name associated with vmwarevmcrypt provider
PbmCapabilityInstance buildCapability(String capabilityName,
List<PbmCapabilityMetadataPerCategory> metadata)
throws InvalidArgumentFaultMsg {
// Create Property Instance with capability vmwarevmcrypt
PbmCapabilityMetadata capabilityMeta =
PbmUtil.getCapabilityMeta(capabilityName,metadata);
if (capabilityMeta == null)
throw new InvalidArgumentFaultMsg("Specified Capability does not exist", null);
// Create and associate Property Instances with a Rule
PbmCapabilityConstraintInstance rule = new PbmCapabilityConstraintInstance();
for (PbmCapabilityPropertyMetadata propMeta : capabilityMeta.getPropertyMetadata()) {
PbmCapabilityPropertyInstance prop = new PbmCapabilityPropertyInstance();
prop.setId(propMeta.getId());
prop.setValue(propMeta.getDefaultValue());
rule.getPropertyInstance().add(prop);
}
// Associate Rule with a Capability Instance
PbmCapabilityInstance capability = new PbmCapabilityInstance();
capability.setId(capabilityMeta.getId());
capability.getConstraint().add(rule);
return capability;
}
@Action
public void createProfile() throws RuntimeFaultFaultMsg,
com.vmware.pbm.RuntimeFaultFaultMsg, InvalidArgumentFaultMsg,
PbmDuplicateNameFaultMsg, PbmFaultProfileStorageFaultFaultMsg {
// Get PBM Profile Manager & Associated Capability Metadata
spbmsc = connection.getPbmServiceContent();
ManagedObjectReference profileMgr = spbmsc.getProfileManager();
// Step 1: Check if there is a vmwarevmcrypt Provider
Boolean encryptionCapable = false;
List<PbmCapabilityVendorResourceTypeInfo> vendorInfo =
connection.getPbmPort().pbmFetchVendorInfo(profileMgr, null);
for (PbmCapabilityVendorResourceTypeInfo vendor : vendorInfo)
for (PbmCapabilityVendorNamespaceInfo vnsi : vendor .getVendorNamespaceInfo())
if (vnsi.getNamespaceInfo().getNamespace().equals("vmwarevmcrypt")) {
encryptionCapable = true;
break;
}
if (!encryptionCapable)
throw new RuntimeFaultFaultMsg(
"Cannot create storage profile. 'vmwarevmcrypt' Provider not found.", null);
// Step 2: Get PBM Supported Capability Metadata
List<PbmCapabilityMetadataPerCategory> metadata =
connection .getPbmPort().pbmFetchCapabilityMetadata(profileMgr,
PbmUtil.getStorageResourceType(),
"com.vmware.iofilters");
// Step 3: Add Provider Specific Capabilities
List<PbmCapabilityInstance> capabilities = new ArrayList<PbmCapabilityInstance>();
capabilities.add(buildCapability("vmwarevmcrypt@ENCRYPTION", metadata));
// Step 4: Add Capabilities to a RuleSet
PbmCapabilitySubProfile ruleSet = new PbmCapabilitySubProfile();
ruleSet.getCapability().addAll(capabilities);
// Step 5: Add Rule-Set to Capability Constraints
PbmCapabilitySubProfileConstraints constraints = new PbmCapabilitySubProfileConstraints();
ruleSet.setName("Rule-Set " + (constraints.getSubProfiles().size() + 1));
constraints.getSubProfiles().add(ruleSet);
// Step 6: Build Capability-Based Profile
PbmCapabilityProfileCreateSpec spec = new PbmCapabilityProfileCreateSpec();
spec.setName(profileName);
spec.setDescription("Storage Profile in SDK. Rule based on Encryption capability");
spec.setResourceType(PbmUtil.getStorageResourceType());
spec.setConstraints(constraints);
// Step 7: Create Storage Profile
PbmProfileId profile = connection.getPbmPort().pbmCreate(profileMgr, spec);
System.out.println("Profile " + profileName + " with ID: " + profile.getUniqueId());
}
@Option(name = "profilename", description = "Name of the storage profile", required = true)
public void setProfileName(String profileName) {
this.profileName = profileName;
}
}