Package org.openstack.client.common

Examples of org.openstack.client.common.OpenstackComputeClient


    OpenstackCloud cloud = findCloud();
    if (cloud == null) {
      throw new OpsException("Could not find cloud");
    }
    OpenstackComputeClient computeClient = openstack.getComputeClient(cloud);

    getRecursionState().pushChildScope(cloud);

    List<String> assignedInstanceIds = instanceTags.findAll(Tag.ASSIGNED);
    if (assignedInstanceIds.isEmpty()) {
      if (createInstance && !OpsContext.isDelete()) {
        MachineCreationRequest request = buildMachineCreationRequest();

        PlatformLayerKey instanceKey = instance.getKey();
        request.tags.add(Tag.buildParentTag(instanceKey));

        String serverName = buildServerName();

        Server created = openstack.createInstance(cloud, serverName, request);

        {
          Tag instanceTag = Tag.build(Tag.ASSIGNED, created.getId());
          platformLayer.addTag(instance.getKey(), instanceTag);
        }

        assignedInstanceIds.add(created.getId());
      }
    }

    if (assignedInstanceIds.isEmpty() && !OpsContext.isDelete()) {
      throw new OpsException("Instance not yet assigned");
    }

    Machine machine = null;
    OpsTarget target = null;

    if (!assignedInstanceIds.isEmpty()) {
      if (assignedInstanceIds.size() != 1) {
        log.warn("Multiple instance ids found: " + assignedInstanceIds);
      }

      // We just take the first instance id
      String assignedInstanceId = Iterables.getFirst(assignedInstanceIds, null);

      Server server = openstack.findServerById(cloud, assignedInstanceId);

      if (server == null) {
        if (OpsContext.isConfigure()) {
          throw new OpsException("Unable to find assigned server: " + assignedInstanceId);
        }
      } else {
        server = openstack.ensureHasPublicIp(cloud, server);

        AsyncServerOperation powerOnOperation = openstack.ensurePoweredOn(cloud, server);
        if (powerOnOperation != null) {
          waitOperation(powerOnOperation);
        }

        machine = new OpenstackComputeMachine(openstack, cloud, server);

        SshKey sshKey = service.getSshKey();
        target = machine.getTarget(sshKey);
      }
    }

    if (!assignedInstanceIds.isEmpty() && OpsContext.isDelete()) {
      CloudBehaviours cloudBehaviours = new CloudBehaviours(cloud);
      boolean supportsSecurityGroups = cloudBehaviours.supportsSecurityGroups();

      for (String instanceId : assignedInstanceIds) {
        Server server = openstack.findServerById(cloud, instanceId);
        if (server == null) {
          log.warn("Could not find assigned server: " + instanceId + ", ignoring");
          continue;
        }

        SecurityGroup securityGroup = null;

        if (supportsSecurityGroups) {
          securityGroup = openstackHelpers.getMachineSecurityGroup(computeClient, server);
        }

        AsyncServerOperation terminateOperation = openstack.terminateInstance(cloud, instanceId);

        if (securityGroup != null) {
          // We need to terminate the instance before we delete the security group it uses
          if (terminateOperation != null) {
            waitOperation(terminateOperation);
          }

          try {
            log.info("Deleting security group: " + securityGroup.getId());
            computeClient.root().securityGroups().securityGroup(securityGroup.getId()).delete();
          } catch (OpenstackNotFoundException e) {
            log.info("Ignoring not-found error while deleting security group: " + securityGroup.getId());
          }
        }
      }
View Full Code Here


    // OpsContext opsContext = OpsContext.get();
    //
    // OpenstackComputeClient computeClient = getOpenstackComputeClient(opsContext.getUserInfo());

    OpenstackCloudHelpers helpers = new OpenstackCloudHelpers();
    OpenstackComputeClient computeClient = helpers.buildOpenstackComputeClient(cloud);

    return computeClient;
  }
View Full Code Here

  // // }
  // // }
  //

  public Server findServerById(OpenstackCloud cloud, String serverId) throws OpsException {
    OpenstackComputeClient computeClient = getComputeClient(cloud);

    try {
      log.info("Getting server info for: " + serverId);
      Server server = computeClient.root().servers().server(serverId).show();
      return server;
    } catch (OpenstackNotFoundException e) {
      return null;
    } catch (OpenstackException e) {
      throw new OpsException("Error getting server", e);
View Full Code Here

  @Inject
  PlatformLayerHelpers platformLayerClient;

  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("platformlayer.org__type")) {
              // if (item.getValue().equals("base")) {
              // isMatch = true;
              // }
              // }

              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")) {

                    // Lenny is no longer getting security updates
                    // if (Strings.equalsIgnoreCase(operatingSystem.getVersion(), "lenny") &&
                    // Strings.equalsIgnoreCase(item.getValue(), "5")) {
                    // matchesVersion = true;
                    // } else

                    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_TYPE)) {
              // if (item.getValue().equals("base")) {
              // isMatch = true;
              // }
              // }

              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("scheduling")) {
        // continue;
        // }
        //
        if (stateName.equals("BUILD")) {
          break;
        }

        // if (stateName.equals("shutdown")) {
        // break;
        // }

        if (stateName.equals("ACTIVE")) {
          break;
        }

        Thread.sleep(1000);
      }

      // OpenstackComputeMachine machine = new OpenstackComputeMachine(instanceInfo.getAccessIPv4(), this,
      // server.getId());

      // 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);
View Full Code Here

    terminateInstance(machine.getCloud(), machine.getOpenstackServerId());
  }

  public AsyncServerOperation terminateInstance(OpenstackCloud cloud, String instanceId) throws OpsException {
    try {
      OpenstackComputeClient computeClient = getComputeClient(cloud);

      log.info("Terminating server: " + instanceId);
      AsyncServerOperation deleteOperation = computeClient.deleteServer(instanceId);
      return deleteOperation;
    } catch (OpenstackNotFoundException e) {
      log.info("Could not find instance to be terminated, assuming already terminated: " + instanceId);
      return null;
    } catch (OpenstackException e) {
View Full Code Here

    if (!publicIps.isEmpty()) {
      return server;
    }

    final OpenstackComputeClient compute = getComputeClient(cloud);

    log.info("Creating floating IP");
    FloatingIp floatingIp = compute.root().floatingIps().create();

    // TODO: Don't abandon the IP e.g. if the attach fails
    log.info("Attching floating IP " + floatingIp.getIp() + " to " + server.getId());
    compute.root().servers().server(server.getId()).addFloatingIp(floatingIp.getIp());

    final String serverId = server.getId();

    try {
      server = TimeoutPoll.poll(TimeSpan.FIVE_MINUTES, TimeSpan.TEN_SECONDS, new PollFunction<Server>() {
        @Override
        public Server call() throws Exception {
          log.info("Waiting for floating IP attach; polling server: " + serverId);
          Server server = compute.root().servers().server(serverId).show();

          List<Ip> publicIps = helpers.findPublicIps(cloud, server);
          if (publicIps.isEmpty()) {
            return null;
          }
View Full Code Here

  public AsyncServerOperation ensurePoweredOn(OpenstackCloud cloud, Server server) throws OpsException {
    String status = server.getStatus();
    if (Objects.equal(status, "SHUTOFF")) {
      try {
        OpenstackComputeClient computeClient = getComputeClient(cloud);

        String serverId = server.getId();
        log.info("Starting SHUTOFF server: " + serverId);

        AsyncServerOperation powerOnOperation = computeClient.powerServerOn(serverId);
        return powerOnOperation;
      } catch (OpenstackException e) {
        throw new OpsException("Error powering server on", e);
      }
    }
View Full Code Here

  @Handler
  public void handler(OpenstackCloud cloud, OpenstackComputeMachine machine) throws OpsException, OpenstackException {
    CloudBehaviours cloudBehaviours = new CloudBehaviours(cloud);

    OpenstackComputeClient openstackComputeClient = cloudContext.getComputeClient(cloud);

    // Find the public address, although the OpenStack firewall may be blocking it
    publicAddress = machine.getNetworkPoint().getBestAddress(NetworkPoint.forPublicInternet());

    if (cloudBehaviours.supportsSecurityGroups()) {
      Server server = machine.getServer();
      SecurityGroup securityGroup = openstackHelpers.getMachineSecurityGroup(openstackComputeClient, server);

      securityGroup = openstackComputeClient.root().securityGroups().securityGroup(securityGroup.getId()).show();

      SecurityGroupRule matchingRule = findMatchingRule(securityGroup);

      if (OpsContext.isConfigure()) {
        if (matchingRule == null) {
          CreateSecurityGroupRuleRequest rule = new CreateSecurityGroupRuleRequest();
          rule.setCidr("0.0.0.0/0");
          rule.setIpProtocol("tcp");
          rule.setFromPort(model.publicPort);
          rule.setToPort(model.publicPort);
          rule.setParentGroupId(securityGroup.getId());

          openstackComputeClient.root().securityGroupRules().create(rule);
        }
      }

      if (OpsContext.isDelete()) {
        if (matchingRule != null) {
          openstackComputeClient.root().securityGroupRules().securityGroupRule(matchingRule.id).delete();
        }
      }
    }
  }
View Full Code Here

    // TODO: We key on endpoint, to avoid repeated calls.
    // Is it safe to assume that everyone has the same capabilities on a cloud??
    CachedInfo info = cachedInfo.get(cloud.endpoint);
    if (info == null) {
      OpenstackCloudHelpers helpers = new OpenstackCloudHelpers();
      OpenstackComputeClient compute = helpers.buildOpenstackComputeClient(cloud);
      List<Extension> extensions = Lists.newArrayList(compute.root().extensions().list());
      info = new CachedInfo(extensions);
      cachedInfo.put(cloud.endpoint, info);
    }
    return info;
  }
View Full Code Here

TOP

Related Classes of org.openstack.client.common.OpenstackComputeClient

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.