Search in sources :

Example 6 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class OpenstackCloudContext method createInstance.

public Server createInstance(OpenstackCloud cloud, String serverName, MachineCreationRequest request) throws OpsException {
    OpenstackComputeClient computeClient = getComputeClient(cloud);
    try {
        Image foundImage = null;
        CloudBehaviours cloudBehaviours = new CloudBehaviours(cloud);
        if (!cloudBehaviours.canUploadImages()) {
            // For now, we presume this is the HP cloud and hard-code the name
            // if (!cloudBehaviours.isHpCloud()) {
            // throw new UnsupportedOperationException();
            // }
            DiskImageRecipe recipe = null;
            if (request.recipeId != null) {
                recipe = platformLayerClient.getItem(request.recipeId, DiskImageRecipe.class);
            }
            OperatingSystemRecipe operatingSystem = null;
            if (recipe != null) {
                operatingSystem = recipe.getOperatingSystem();
            }
            log.info("Listing images to pick best image");
            Iterable<Image> images = computeClient.root().images().list();
            if (cloudBehaviours.isHpCloud()) {
                // TODO: We need a better solution here!!
                Set<String> imageNames = Sets.newHashSet("Debian Squeeze 6.0.3 Server 64-bit 20120123");
                log.warn("Hard coding image name (presuming HP cloud)");
                // TODO: Match OS
                for (Image image : images) {
                    if (imageNames.contains(image.getName())) {
                        foundImage = image;
                        break;
                    }
                }
            } else if (cloudBehaviours.isRackspaceCloud()) {
                if (operatingSystem == null) {
                    operatingSystem = new OperatingSystemRecipe();
                    operatingSystem.setDistribution("debian");
                    operatingSystem.setVersion("squeeze");
                }
                for (Image image : images) {
                    boolean matchesDistribution = false;
                    boolean matchesVersion = false;
                    for (Image.ImageMetadata.ImageMetadataItem item : image.getMetadata()) {
                        if (item.getKey().equals("os_distro")) {
                            if (operatingSystem != null && operatingSystem.getDistribution() != null) {
                                if (Comparisons.equalsIgnoreCase(operatingSystem.getDistribution(), item.getValue())) {
                                    matchesDistribution = true;
                                }
                            }
                        }
                        if (item.getKey().equals("os_version")) {
                            if (operatingSystem != null && operatingSystem.getVersion() != null) {
                                if (Comparisons.equalsIgnoreCase(operatingSystem.getVersion(), item.getValue())) {
                                    matchesVersion = true;
                                } else if (Comparisons.equalsIgnoreCase(operatingSystem.getDistribution(), "debian")) {
                                    if (Comparisons.equalsIgnoreCase(operatingSystem.getVersion(), "squeeze") && Comparisons.equalsIgnoreCase(item.getValue(), "6")) {
                                        matchesVersion = true;
                                    } else {
                                        matchesVersion = false;
                                    }
                                } else if (Comparisons.equalsIgnoreCase(operatingSystem.getDistribution(), "ubuntu")) {
                                    if (Comparisons.equalsIgnoreCase(operatingSystem.getVersion(), "lucid") && Comparisons.equalsIgnoreCase(item.getValue(), "10.04LTS")) {
                                        matchesVersion = true;
                                    } else {
                                        matchesVersion = false;
                                    }
                                } else {
                                    matchesVersion = false;
                                }
                            }
                        }
                    }
                    if (matchesDistribution && matchesVersion) {
                        foundImage = image;
                        break;
                    }
                }
            } else {
                for (Image image : images) {
                    boolean isMatch = false;
                    for (Image.ImageMetadata.ImageMetadataItem item : image.getMetadata()) {
                        if (item.getKey().equals(Tag.IMAGE_OS_DISTRIBUTION)) {
                            if (operatingSystem != null && operatingSystem.getDistribution() != null) {
                                if (!Comparisons.equalsIgnoreCase(operatingSystem.getDistribution(), item.getValue())) {
                                    isMatch = false;
                                }
                            }
                        }
                        if (item.getKey().equals(Tag.IMAGE_OS_VERSION)) {
                            if (operatingSystem != null && operatingSystem.getVersion() != null) {
                                if (!Comparisons.equalsIgnoreCase(operatingSystem.getVersion(), item.getValue())) {
                                    isMatch = false;
                                }
                            }
                        }
                    }
                    if (isMatch) {
                        foundImage = image;
                        break;
                    }
                }
            }
            if (foundImage == null) {
                throw new IllegalArgumentException("Could not find image");
            }
        } else {
            List<ImageFormat> formats = Collections.singletonList(ImageFormat.DiskQcow2);
            CloudImage image = imageFactory.getOrCreateImageId(cloud, formats, request.recipeId);
            String imageId = image.getId();
            log.info("Getting image details for image: " + imageId);
            foundImage = computeClient.root().images().image(imageId).show();
            if (foundImage == null) {
                throw new IllegalArgumentException("Could not find image: " + imageId);
            }
        }
        SecurityGroup createdSecurityGroup = null;
        if (cloudBehaviours.supportsSecurityGroups()) {
            SecurityGroup createTemplate = new SecurityGroup();
            createTemplate.setName(SECURITY_GROUP_PREFIX + serverName);
            createTemplate.setDescription("Security group for instance: " + serverName);
            try {
                log.info("Creating security group: " + createTemplate.getName());
                createdSecurityGroup = computeClient.root().securityGroups().create(createTemplate);
            } catch (OpenstackException e) {
                for (SecurityGroup candidate : computeClient.root().securityGroups().list()) {
                    if (Objects.equal(candidate.getName(), createTemplate.getName())) {
                        createdSecurityGroup = candidate;
                        break;
                    }
                }
                if (createdSecurityGroup != null) {
                    // Ignore
                    log.warn("Ignoring 'security group already exists' error: " + e.getMessage());
                } else {
                    throw new OpsException("Error creating security group", e);
                }
            }
            {
                CreateSecurityGroupRuleRequest newRule = new CreateSecurityGroupRuleRequest();
                newRule.setCidr("0.0.0.0/0");
                newRule.setFromPort(22);
                newRule.setToPort(22);
                newRule.setIpProtocol("tcp");
                newRule.setParentGroupId(createdSecurityGroup.getId());
                try {
                    log.info("Creating security group rule for port: " + newRule.getToPort());
                    SecurityGroupRule createdRule = computeClient.root().securityGroupRules().create(newRule);
                } catch (OpenstackException e) {
                    String message = e.getMessage();
                    if (message != null && message.contains("This rule already exists")) {
                        log.warn("Ignoring 'rule already exists': " + e.getMessage());
                    } else {
                        throw new OpsException("Error creating security group access", e);
                    }
                }
            }
        }
        AsyncServerOperation createServerOperation;
        {
            ServerForCreate create = new ServerForCreate();
            create.setName(serverName);
            if (request.sshPublicKey != null) {
                if (cloudBehaviours.supportsPublicKeys()) {
                    OpenstackCloudHelpers cloudHelpers = new OpenstackCloudHelpers();
                    KeyPair keyPair = cloudHelpers.ensurePublicKeyUploaded(computeClient, request.sshPublicKeyName, request.sshPublicKey);
                    create.setKeyName(keyPair.getName());
                } else if (cloudBehaviours.supportsFileInjection()) {
                    String fileContents = SshKeys.serialize(request.sshPublicKey);
                    create.addUploadFile("/root/.ssh/authorized_keys", Utf8.getBytes(fileContents));
                } else {
                    throw new OpsException("No supported SSH key mechanism on cloud");
                }
            }
            create.setImageRef(foundImage.getId());
            Flavor flavor = getClosestInstanceType(computeClient, request);
            if (flavor == null) {
                throw new OpsException("Cannot determine instance type for request");
            }
            create.setFlavorRef(flavor.getId());
            if (request.securityGroups != null) {
                // TODO: Reimplement if needed
                throw new UnsupportedOperationException();
            }
            if (createdSecurityGroup != null) {
                ServerForCreate.SecurityGroup serverSecurityGroup = new ServerForCreate.SecurityGroup();
                serverSecurityGroup.setName(createdSecurityGroup.getName());
                create.getSecurityGroups().add(serverSecurityGroup);
            }
            create.setConfigDrive(cloudBehaviours.useConfigDrive());
            log.info("Launching new server: " + create.getName());
            createServerOperation = computeClient.createServer(create);
        }
        log.info("Waiting for server to be ready");
        Server server = createServerOperation.waitComplete();
        Server instanceInfo = null;
        String stateName = null;
        while (true) {
            instanceInfo = getInstanceInfo(computeClient, server.getId());
            stateName = instanceInfo.getStatus();
            log.info("Instance state: " + stateName);
            // 
            if (stateName.equals("BUILD")) {
                break;
            }
            if (stateName.equals("ACTIVE")) {
                break;
            }
            Thread.sleep(1000);
        }
        // Even if the machine is in 'error' state, we still want to associate it with us
        if (request.tags != null) {
            Server newServerInfo = new Server();
            Metadata metadata = new Metadata();
            for (Tag tag : request.tags) {
                Metadata.Item meta = new Metadata.Item();
                meta.setKey(tag.getKey());
                meta.setValue(tag.getValue());
                metadata.getItems().add(meta);
            }
            newServerInfo.setMetadata(metadata);
            log.info("Tagging server: " + server.getId());
            computeClient.root().servers().server(server.getId()).update(newServerInfo);
        }
        return server;
    } catch (InterruptedException e) {
        ExceptionUtils.handleInterrupted(e);
        throw new OpsException("Error building server", e);
    } catch (OpenstackException e) {
        throw new OpsException("Error building server", e);
    }
}
Also used : OpsException(org.platformlayer.ops.OpsException) Server(org.openstack.model.compute.Server) Metadata(org.openstack.model.compute.Metadata) CloudImage(org.platformlayer.ops.images.CloudImage) Image(org.openstack.model.compute.Image) CloudImage(org.platformlayer.ops.images.CloudImage) OpenstackException(org.openstack.client.OpenstackException) ImageFormat(org.platformlayer.ops.images.ImageFormat) DiskImageRecipe(org.platformlayer.images.model.DiskImageRecipe) CreateSecurityGroupRuleRequest(org.openstack.model.compute.CreateSecurityGroupRuleRequest) KeyPair(org.openstack.model.compute.KeyPair) OpenstackComputeClient(org.openstack.client.common.OpenstackComputeClient) SecurityGroupRule(org.openstack.model.compute.SecurityGroupRule) SecurityGroup(org.openstack.model.compute.SecurityGroup) Flavor(org.openstack.model.compute.Flavor) ServerForCreate(org.openstack.model.compute.ServerForCreate) Tag(org.platformlayer.core.model.Tag) OperatingSystemRecipe(org.platformlayer.images.model.OperatingSystemRecipe) AsyncServerOperation(org.openstack.client.compute.AsyncServerOperation)

Example 7 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class GlanceImageStore method updateImageTags.

@Override
public void updateImageTags(String imageId, Tags tags) throws OpsException {
    OpenstackImageClient glanceClient = getOpenstackImageClient();
    boolean replace = false;
    try {
        Map<String, Object> tagMap = Maps.newHashMap();
        for (Tag tag : tags.getTags()) {
            tagMap.put(tag.getKey(), tag.getValue());
        }
        glanceClient.root().images().image(imageId).updateMetadata(tagMap, replace);
    } catch (OpenstackException e) {
        throw new OpsException("Error updating image tags", e);
    }
}
Also used : OpsException(org.platformlayer.ops.OpsException) OpenstackImageClient(org.openstack.client.common.OpenstackImageClient) JSONObject(org.json.JSONObject) Tag(org.platformlayer.core.model.Tag) OpenstackException(org.openstack.client.OpenstackException)

Example 8 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class PersistentInstanceMapper method handler.

@Handler
public void handler(PersistentInstance model) throws OpsException {
    Machine machine = null;
    Tag tagForInstance = Tag.buildParentTag(model.getKey());
    // boolean instanceIsTagged = false;
    // See if we have an instance id tag
    {
    // String instanceKey = model.getTags().findUnique(Tag.INSTANCE_KEY);
    // if (instanceKey != null) {
    // InstanceBase foundInstance = cloud.findInstanceByInstanceKey(PlatformLayerKey.parse(instanceKey));
    // if (foundInstance == null) {
    // throw new IllegalStateException("Tagged with instance id, but instance not found: " + instanceKey);
    // }
    // if (foundInstance.getState() == ManagedItemState.DELETED) {
    // log.warn("Found deleted instance: " + foundInstance);
    // } else {
    // machine = cloudHelpers.toMachine(foundInstance);
    // if (machine == null) {
    // throw new IllegalStateException();
    // }
    // }
    // 
    // // instanceIsTagged = true;
    // }
    }
    if (machine == null) {
        // We may have created a machine, but failed to tag the instance
        machine = cloud.findMachine(tagForInstance);
    }
    if (!OpsContext.isDelete()) {
        // We always PUT the machine
        // TODO: Check if unchanged??
        MachineCreationRequest request = buildMachineCreationRequest(model);
        request.tags.add(tagForInstance);
        machine = cloudHelpers.putInstanceByTag(request, model.getKey(), tagForInstance);
    // if (machine == null) {
    // // No machine
    // MachineCreationRequest request = buildMachineCreationRequest(model);
    // request.tags.add(tagForInstance);
    // 
    // machine = cloudHelpers.createInstance(request, model.getKey(), tagForInstance);
    // }
    } else {
        if (machine != null) {
            cloudHelpers.terminateMachine(machine);
        }
    }
    getRecursionState().pushChildScope(Machine.class, machine);
}
Also used : Tag(org.platformlayer.core.model.Tag) MachineCreationRequest(org.platformlayer.ops.MachineCreationRequest) Machine(org.platformlayer.ops.Machine) Handler(org.platformlayer.ops.Handler)

Example 9 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class EnsureJenkinsSshKey method doHandle.

@Handler
public void doHandle(OpsTarget target) throws OpsException {
    String sshKey = Tag.SSH_KEY.findFirst(jenkins);
    if (Strings.isNullOrEmpty(sshKey)) {
        if (OpsContext.isConfigure()) {
            File sshPublicKeyPath = new File("/var/lib/jenkins/.ssh/id_rsa.pub");
            sshKey = target.readTextFile(sshPublicKeyPath);
            if (sshKey == null) {
                // su -c "ssh-keygen -q -f /var/lib/jenkins/.ssh/id_rsa -N ''" jenkins
                Command keygenCommand = Command.build("su");
                keygenCommand.addLiteral("-c").addQuoted("ssh-keygen -q -f /var/lib/jenkins/.ssh/id_rsa -N ''");
                keygenCommand.addLiteral("jenkins");
                target.executeCommand(keygenCommand);
                sshKey = target.readTextFile(sshPublicKeyPath);
            }
            if (Strings.isNullOrEmpty(sshKey)) {
                throw new OpsException("Unable to generate SSH key");
            }
            Tag tag = Tag.SSH_KEY.build(sshKey);
            platformlayer.addTag(jenkins.getKey(), tag);
        }
        if (OpsContext.isValidate()) {
            log.error("SSH Key not configured for Jenkins");
        }
    }
    if (sshKey != null) {
        log.debug("SSH Key is " + sshKey);
    }
}
Also used : OpsException(org.platformlayer.ops.OpsException) Command(org.platformlayer.ops.Command) Tag(org.platformlayer.core.model.Tag) File(java.io.File) Handler(org.platformlayer.ops.Handler)

Example 10 with Tag

use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.

the class CloudInstanceMapper method doOperation.

@Handler
public void doOperation() throws OpsException, IOException {
    Tag tag = Tag.build(Tag.ASSIGNED, instance.getKey().getUrl());
    List<DirectHost> hosts = Lists.newArrayList(platformLayer.listItems(DirectHost.class, TagFilter.byTag(tag)));
    if (hosts.size() > 1) {
        // Huh?
        throw new OpsException("Multiple hosts already assigned");
    }
    DirectHost host;
    if (hosts.isEmpty()) {
        if (OpsContext.isDelete()) {
            host = null;
        } else {
            if (createInstance) {
                DirectCloudHost cloudHost = cloudMap.pickHost(instance);
                host = cloudHost.getModel();
                platformLayer.addTag(host.getKey(), tag);
            } else {
                throw new OpsException("Instance not yet assigned");
            }
        }
    } else {
        host = hosts.get(0);
    }
    RecursionState recursion = getRecursionState();
    if (host != null) {
        this.cloud = platformLayer.getItem(host.cloud, DirectCloud.class);
        this.hostTarget = directHelpers.toTarget(host);
        recursion.pushChildScope(cloud);
        recursion.pushChildScope(host);
        recursion.pushChildScope(hostTarget);
    } else {
        if (!OpsContext.isDelete()) {
            throw new IllegalStateException();
        }
        log.info("No host set; won't recurse in");
        recursion.setPreventRecursion(true);
    }
}
Also used : DirectCloud(org.platformlayer.service.cloud.direct.model.DirectCloud) DirectHost(org.platformlayer.service.cloud.direct.model.DirectHost) OpsException(org.platformlayer.ops.OpsException) DirectCloudHost(org.platformlayer.service.cloud.direct.ops.cloud.DirectCloudHost) Tag(org.platformlayer.core.model.Tag) Handler(org.platformlayer.ops.Handler)

Aggregations

Tag (org.platformlayer.core.model.Tag)41 OpsException (org.platformlayer.ops.OpsException)16 ItemBase (org.platformlayer.core.model.ItemBase)8 PlatformLayerKey (org.platformlayer.core.model.PlatformLayerKey)8 Tags (org.platformlayer.core.model.Tags)8 Handler (org.platformlayer.ops.Handler)8 TagChanges (org.platformlayer.core.model.TagChanges)6 JSONObject (org.json.JSONObject)4 OpenstackException (org.openstack.client.OpenstackException)4 RepositoryException (org.platformlayer.RepositoryException)4 Machine (org.platformlayer.ops.Machine)4 JdbcTransaction (com.fathomdb.jdbc.JdbcTransaction)3 SQLException (java.sql.SQLException)3 OpenstackImageClient (org.openstack.client.common.OpenstackImageClient)3 Filter (org.platformlayer.Filter)3 PlatformLayerClient (org.platformlayer.PlatformLayerClient)3 StateFilter (org.platformlayer.StateFilter)3 OpsTarget (org.platformlayer.ops.OpsTarget)3 UniqueTag (org.platformlayer.ops.UniqueTag)3 SshKey (org.platformlayer.ops.helpers.SshKey)3