/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.vipr.client; import java.net.URI; import java.util.ArrayList; import java.util.List; import com.emc.vipr.model.keystore.*; import org.apache.log4j.Level; import org.apache.log4j.Logger; import com.emc.storageos.model.block.VolumeCreate; import com.emc.storageos.model.block.VolumeRestRep; import com.emc.storageos.model.block.export.ExportCreateParam; import com.emc.storageos.model.block.export.ExportGroupRestRep; import com.emc.storageos.model.block.export.ExportUpdateParam; import com.emc.storageos.model.host.HostRestRep; import com.emc.storageos.model.project.ProjectRestRep; import com.emc.storageos.model.varray.VirtualArrayRestRep; import com.emc.storageos.model.vpool.BlockVirtualPoolRestRep; import com.emc.vipr.client.core.filters.HostTypeFilter; public class ViPRClientApp { private final static String TRUSTED_CERTIFICATE = "-----BEGIN CERTIFICATE-----\r\n" + "MIIE/zCCA+egAwIBAgIRAJ9si9NLc1lAY+R202n9/fowDQYJKoZIhvcNAQEFBQAw\r\n" + "gZcxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQH\r\n" + "EwdCZWRmb3JkMRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgTExDMSUwIwYDVQQLExxH\r\n" + "bG9iYWwgU2VjdXJpdHkgT3JnYW5pemF0aW9uMRwwGgYDVQQDExNSU0EgQ29ycG9y\r\n" + "YXRlIENBIHYyMB4XDTExMDMxMDIxNDA1N1oXDTE5MDIyODIxNTYzM1owgZ4xCzAJ\r\n" + "BgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMRAwDgYDVQQHEwdCZWRm\r\n" + "b3JkMRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgTExDMSUwIwYDVQQLExxHbG9iYWwg\r\n" + "U2VjdXJpdHkgT3JnYW5pemF0aW9uMSMwIQYDVQQDExpSU0EgQ29ycG9yYXRlIFNl\r\n" + "cnZlciBDQSB2MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMlEfyTA\r\n" + "hnX8JlErtRFUAIougscUT91SFwxYsDoqjuw1jOQPASUPcJDq4Axjje8kHwSlcpeB\r\n" + "23lehX+yutvWBXKRsr4Exu2ObkSYkrli2dpgl+LpLVAEnZaOikZLjHzXIeH6O79u\r\n" + "UsB0JZbvQ9B3X5q2IFrjLiB55Mc1IBNJY/Ebr4OU/HkvxB3GWmqeHL9uH2yC15CE\r\n" + "5iM+Za83+nuGulthVguBSeQWyAodvAKW5BE9W4XoYpMYuIzL5haiOz0fvgf2PbGo\r\n" + "44EVhrN1sxyi9qGEslRy4poXGXD3WQltVbOk6QlssKBTG9wOcVIiXO0t6RyuzXIn\r\n" + "sGX8pV3csrJdsDECAwEAAaOCATswggE3MA8GA1UdEwQIMAYBAf8CAQIwgZEGA1Ud\r\n" + "IASBiTCBhjCBgwYJKoZIhvcNBQcCMHYwLgYIKwYBBQUHAgEWImh0dHA6Ly9jYS5y\r\n" + "c2FzZWN1cml0eS5jb20vQ1BTLmh0bWwwRAYIKwYBBQUHAgIwODAXFhBSU0EgU2Vj\r\n" + "dXJpdHkgTExDMAMCAQEaHUNQUyBJbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlMEAG\r\n" + "A1UdHwQ5MDcwNaAzoDGGL2h0dHA6Ly9jcmwucnNhc2VjdXJpdHkuY29tL1JTQUNv\r\n" + "cnBvcmF0ZUNBdjIuY3JsMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUKfPCY9Px\r\n" + "9Qulv7Jd32EQlDTPRwwwHwYDVR0jBBgwFoAUcxs4SyXLWo69AuzfXSn2EHQO2Jgw\r\n" + "DQYJKoZIhvcNAQEFBQADggEBAB7jJkSi8fSAIWG9bqsNzC0/6F3Vsism5BizSxtU\r\n" + "X8nTRHaCzYOLY2PnjieySxqVOofsCKrnGQpIeax2Vre8UHvIhU9fhzj2+n4LbmfJ\r\n" + "GcWCGk75CKTn/tWc8jemllyT/5pSQOtt+Qw6LJ6+sprJtnQ7st/e+PzG8MkLjNVl\r\n" + "U7WIrxCns2ZEbqHO/easHZ3rMu3jG4RfNa44r6zrU58TPQ3y3Tnwbo3vRrOvVOTG\r\n" + "2zJiPPbNMuFlAKmc2TYhODc0aDFUtdeskbc/SKcb5PvlQesG8J2PkktKAhoTxeFj\r\n" + "pvsXSNCQ5DpPyB/uGozgI8tgoNjDm11O57DCxZFQ6qPsIwI=\r\n" + "-----END CERTIFICATE-----"; private final ViPRCoreClient client; public ViPRClientApp(ViPRCoreClient client) { this.client = client; } public HostRestRep chooseHost(List<HostRestRep> hosts) { if (hosts.isEmpty()) { throw new IllegalArgumentException("No hosts"); } return hosts.get(0); } public VirtualArrayRestRep chooseVirtualArray(List<VirtualArrayRestRep> virtualArrays) { if (virtualArrays.isEmpty()) { throw new IllegalArgumentException("No virtualArrays"); } return virtualArrays.get(0); } public BlockVirtualPoolRestRep chooseVirtualPool(List<BlockVirtualPoolRestRep> virtualPools) { if (virtualPools.isEmpty()) { throw new IllegalArgumentException("No virtualPools"); } return virtualPools.get(0); } public ProjectRestRep chooseProject(List<ProjectRestRep> projects) { if (projects.isEmpty()) { throw new IllegalArgumentException("No projects"); } return projects.get(0); } public static void main(String[] args) { Logger.getRootLogger().setLevel(Level.INFO); ViPRCoreClient client = new ViPRCoreClient("localhost", true).withLogin("root", "ChangeMe"); try { ViPRClientApp application = new ViPRClientApp(client); application.updateTrustStore(); application.createBlockVolumeForHost(); application.changeKeyAndCert(); } finally { client.auth().logout(); } } private void updateTrustStore() { TruststoreSettings settings = client.truststore().getTruststoreSettings(); TruststoreSettingsChanges settingsChanges = new TruststoreSettingsChanges(); settingsChanges.setAcceptAllCertificates(!settings.isAcceptAllCertificates()); TruststoreSettings newSettings = client.truststore().updateTruststoreSettings(settingsChanges); if (newSettings.isAcceptAllCertificates() == settings.isAcceptAllCertificates()) { throw new IllegalStateException("trust store settings were not changed"); } System.out.println("truststore settings changed to acceptAllCertificates=" + newSettings.isAcceptAllCertificates()); List<TrustedCertificate> certs = client.truststore().getTrustedCertificates(); TrustedCertificateChanges certsChanges = new TrustedCertificateChanges(); List<String> changes = new ArrayList<String>(); if (certs.isEmpty() || checkForCert(certs)) { changes.add(TRUSTED_CERTIFICATE); certsChanges.setAdd(changes); List<TrustedCertificate> newCerts = client.truststore().updateTrustedCertificate(certsChanges); if (certs.size() + 1 != newCerts.size()) { throw new IllegalStateException("new cert was not added"); } } else { changes.add(TRUSTED_CERTIFICATE); certsChanges.setRemove(changes); List<TrustedCertificate> newCerts = client.truststore().updateTrustedCertificate(certsChanges); if (checkForCert(newCerts)) { throw new IllegalStateException("trusted cert was not removed"); } } } private boolean checkForCert(List<TrustedCertificate> certs) { for (TrustedCertificate cert : certs) { if (removeNewLines(cert.getCertString()).equals(removeNewLines(TRUSTED_CERTIFICATE))) { return true; } } return false; } private void changeKeyAndCert() { CertificateChain chain = client.keystore().getCertificateChain(); CertificateChain newChain = client.keystore().regenerateKeyAndCertificate(); if (chain.getChain().equals(newChain.getChain())) { throw new IllegalStateException("Certificate hasn't changed"); } System.out.println("key and certificate updated. New Certificate:" + newChain.getChain()); } private String removeNewLines(String withNewLines) { return withNewLines.replaceAll("\n", "").replaceAll("\r", ""); } public void createBlockVolumeForHost() { List<HostRestRep> hosts = client.hosts().getByUserTenant(HostTypeFilter.ESX.not()); // User choice HostRestRep selectedHost = chooseHost(hosts); List<VirtualArrayRestRep> virtualArrays = client.varrays().findByConnectedHost(selectedHost); // User choice VirtualArrayRestRep selectedVirtualArray = chooseVirtualArray(virtualArrays); List<BlockVirtualPoolRestRep> virtualPools = client.blockVpools().getByVirtualArray(selectedVirtualArray.getId()); // User choice BlockVirtualPoolRestRep selectedVirtualPool = chooseVirtualPool(virtualPools); List<ProjectRestRep> projects = client.projects().getByUserTenant(); // User choice ProjectRestRep selectedProject = chooseProject(projects); URI volumeId = createVolume(selectedVirtualArray, selectedVirtualPool, selectedProject); List<ExportGroupRestRep> exports = new ArrayList<>(); if (exports.isEmpty()) { createExport(volumeId, selectedHost, selectedVirtualArray, selectedProject); } else { addVolumeToExport(volumeId, exports.get(0)); } } public URI createVolume(VirtualArrayRestRep virtualArray, BlockVirtualPoolRestRep virtualPool, ProjectRestRep project) { VolumeCreate input = new VolumeCreate(); input.setName("SDSClientApp_Volume_" + System.currentTimeMillis()); input.setVarray(virtualArray.getId()); input.setVpool(virtualPool.getId()); input.setSize("2GB"); input.setCount(1); input.setProject(project.getId()); Task<VolumeRestRep> task = client.blockVolumes().create(input).firstTask(); VolumeRestRep volume = task.get(); System.out.println("Created Volume: " + volume.getId()); return volume.getId(); } public URI createExport(URI volumeId, HostRestRep host, VirtualArrayRestRep virtualArray, ProjectRestRep project) { ExportCreateParam input = new ExportCreateParam(); input.setName("SDSClientApp_Export"); input.setType("Host"); input.addHost(host.getId()); input.setVarray(virtualArray.getId()); input.addVolume(volumeId); input.setProject(project.getId()); ExportGroupRestRep export = client.blockExports().create(input).get(); System.out.println("Created Export Group: " + export.getId()); return export.getId(); } public void addVolumeToExport(URI volumeId, ExportGroupRestRep export) { ExportUpdateParam input = new ExportUpdateParam(); input.addVolume(volumeId); client.blockExports().update(export.getId(), input); } }