@Override
  @Nullable
  public LoginCredentials get() {
    if (credentialStore.containsKey("image")) {
      return LoginCredentials.builder(credentialStore.get("image")).build();
    }
    Builder builder = LoginCredentials.builder();

    String loginUser = config.apply(provider + ".image.login-user");
    if (loginUser == null) loginUser = config.apply("jclouds.image.login-user");
    if (loginUser != null) {
      int pos = loginUser.indexOf(':');
      if (pos != -1) {
        builder.user(loginUser.substring(0, pos)).password(loginUser.substring(pos + 1));
      } else builder.user(loginUser);
    }

    String authenticateSudo = config.apply(provider + ".image.authenticate-sudo");
    if (authenticateSudo == null)
      authenticateSudo = config.apply("jclouds.image.authenticate-sudo");
    if (authenticateSudo != null) {
      builder.authenticateSudo(Boolean.valueOf(authenticateSudo));
    }

    LoginCredentials creds = builder.build();
    if (creds != null) credentialStore.put("image", creds);
    return creds;
  }
  // Suggest at least 15 minutes for timeout
  public static String waitForPasswordOnAws(
      ComputeService computeService, final NodeMetadata node, long timeout, TimeUnit timeUnit)
      throws TimeoutException {
    ComputeServiceContext computeServiceContext = computeService.getContext();
    AWSEC2Api ec2Client = computeServiceContext.unwrapApi(AWSEC2Api.class);
    final WindowsApi client = ec2Client.getWindowsApi().get();
    final String region = node.getLocation().getParent().getId();

    // The Administrator password will take some time before it is ready - Amazon says sometimes 15
    // minutes.
    // So we create a predicate that tests if the password is ready, and wrap it in a retryable
    // predicate.
    Predicate<String> passwordReady =
        new Predicate<String>() {
          @Override
          public boolean apply(String s) {
            if (Strings.isNullOrEmpty(s)) return false;
            PasswordData data = client.getPasswordDataInRegion(region, s);
            if (data == null) return false;
            return !Strings.isNullOrEmpty(data.getPasswordData());
          }
        };

    LOG.info("Waiting for password, for " + node.getProviderId() + ":" + node.getId());
    Predicate<String> passwordReadyRetryable =
        Predicates2.retry(
            passwordReady, timeUnit.toMillis(timeout), 10 * 1000, TimeUnit.MILLISECONDS);
    boolean ready = passwordReadyRetryable.apply(node.getProviderId());
    if (!ready)
      throw new TimeoutException(
          "Password not available for "
              + node
              + " in region "
              + region
              + " after "
              + timeout
              + " "
              + timeUnit.name());

    // Now pull together Amazon's encrypted password blob, and the private key that jclouds
    // generated
    PasswordDataAndPrivateKey dataAndKey =
        new PasswordDataAndPrivateKey(
            client.getPasswordDataInRegion(region, node.getProviderId()),
            node.getCredentials().getPrivateKey());

    // And apply it to the decryption function
    WindowsLoginCredentialsFromEncryptedData f =
        computeServiceContext
            .utils()
            .injector()
            .getInstance(WindowsLoginCredentialsFromEncryptedData.class);
    LoginCredentials credentials = f.apply(dataAndKey);

    return credentials.getPassword();
  }
 @Override
 protected void addCredentialsForInstance(NodeMetadataBuilder builder, RunningInstance instance) {
   LoginCredentials creds =
       LoginCredentials.fromCredentials(
           credentialStore.get("node#" + instance.getRegion() + "/" + instance.getId()));
   String spotRequestId = AWSRunningInstance.class.cast(instance).getSpotInstanceRequestId();
   if (creds == null && spotRequestId != null) {
     creds =
         LoginCredentials.fromCredentials(
             credentialStore.get("node#" + instance.getRegion() + "/" + spotRequestId));
     if (creds != null)
       credentialStore.put("node#" + instance.getRegion() + "/" + instance.getId(), creds);
   }
   if (creds != null) builder.credentials(creds);
 }
  public void testParseCCImage() {

    Set<org.jclouds.compute.domain.Image> result = convertImages("/describe_images_cc.xml");

    assertEquals(
        Iterables.get(result, 0),
        new ImageBuilder()
            .name("EC2 CentOS 5.4 HVM AMI")
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.CENTOS)
                    .arch("hvm")
                    .version("5.4")
                    .description("amazon/EC2 CentOS 5.4 HVM AMI")
                    .is64Bit(true)
                    .build())
            .description("EC2 CentOS 5.4 HVM AMI")
            .defaultCredentials(LoginCredentials.builder().user("root").build())
            .id("us-east-1/ami-7ea24a17")
            .providerId("ami-7ea24a17")
            .location(defaultLocation)
            .userMetadata(
                ImmutableMap.of(
                    "owner", "206029621532",
                    "rootDeviceType", "ebs",
                    "virtualizationType", "hvm",
                    "hypervisor", "xen"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .build());
    assertEquals(
        Iterables.get(result, 0).getStatus(), org.jclouds.compute.domain.Image.Status.AVAILABLE);
  }
  protected void tryOverrideUsingPropertyKey(String propertyKey) {
    ComputeServiceContext context = null;
    try {
      Properties overrides = setupProperties();
      String login = loginUser != null ? loginUser : "******";
      overrides.setProperty(propertyKey + ".image.login-user", login);
      boolean auth = authenticateSudo != null ? Boolean.valueOf(authenticateSudo) : true;
      overrides.setProperty(propertyKey + ".image.authenticate-sudo", auth + "");

      context =
          new ComputeServiceContextFactory()
              .createContext(provider, ImmutableSet.<Module>of(getLoggingModule()), overrides);

      Iterable<String> userPass = Splitter.on(':').split(login);
      String user = Iterables.get(userPass, 0);
      String pass = Iterables.size(userPass) > 1 ? Iterables.get(userPass, 1) : null;
      assertEquals(
          context.getComputeService().templateBuilder().build().getImage().getDefaultCredentials(),
          LoginCredentials.builder().user(user).password(pass).authenticateSudo(auth).build());
    } finally {
      if (context != null) {
        // Need to clear persisted credentials; otherwise next time a ComputeServiceContext is
        // created
        // then it will have these "foo" credentials!
        context.credentialStore().clear();
        context.close();
      }
    }
  }
  public void testParseVostokImage() {

    Set<org.jclouds.compute.domain.Image> result = convertImages("/vostok.xml");

    assertEquals(
        Iterables.get(result, 0),
        new ImageBuilder()
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.UNRECOGNIZED)
                    .arch("paravirtual")
                    .version("")
                    .description("vostok-builds/vostok-0.95-5622/vostok-0.95-5622.manifest.xml")
                    .is64Bit(false)
                    .build())
            .description("vostok-builds/vostok-0.95-5622/vostok-0.95-5622.manifest.xml")
            .defaultCredentials(LoginCredentials.builder().user("root").build())
            .id("us-east-1/ami-870de2ee")
            .providerId("ami-870de2ee")
            .location(defaultLocation)
            .version("5622")
            .userMetadata(
                ImmutableMap.of("owner", "133804938231", "rootDeviceType", "instance-store"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .build());
  }
 public TemplateBuilder createTemplateBuilder() {
   final Supplier<Set<? extends Image>> images =
       Suppliers.<Set<? extends Image>>ofInstance(
           ImmutableSet.of(
               new ImageBuilder()
                   .providerId("ebs-image-provider")
                   .name("image")
                   .id("us-east-1/bogus-image")
                   .location(jcloudsDomainLocation)
                   .userMetadata(ImmutableMap.of("rootDeviceType", RootDeviceType.EBS.value()))
                   .operatingSystem(
                       new OperatingSystem(
                           OsFamily.UBUNTU,
                           null,
                           "1.0",
                           VirtualizationType.PARAVIRTUAL.value(),
                           "ubuntu",
                           true))
                   .description("description")
                   .version("1.0")
                   .defaultCredentials(LoginCredentials.builder().user("root").build())
                   .status(Image.Status.AVAILABLE)
                   .build()));
   ImmutableMap<RegionAndName, Image> imageMap =
       (ImmutableMap<RegionAndName, Image>) ImagesToRegionAndIdMap.imagesToMap(images.get());
   Supplier<LoadingCache<RegionAndName, ? extends Image>> imageCache =
       Suppliers.<LoadingCache<RegionAndName, ? extends Image>>ofInstance(
           CacheBuilder.newBuilder()
               .<RegionAndName, Image>build(CacheLoader.from(Functions.forMap(imageMap))));
   JcloudsStubTemplateBuilder jcloudsStubTemplateBuilder = new JcloudsStubTemplateBuilder();
   return jcloudsStubTemplateBuilder.newTemplateBuilder(images, imageCache);
 }
  @Test(enabled = true)
  public void testShellAccess() throws IOException {
    final String nameOfServer = "Server" + String.valueOf(new Date().getTime()).substring(6);
    serversToDeleteAfterTheTests.add(nameOfServer);

    Set<Ip> availableIps = client.getIpServices().getUnassignedIpList();
    Ip availableIp = Iterables.getLast(availableIps);

    Server createdServer =
        client
            .getServerServices()
            .addServer(
                nameOfServer, "GSI-f8979644-e646-4711-ad58-d98a5fa3612c", "1", availableIp.getIp());
    assertNotNull(createdServer);
    assert serverLatestJobCompleted.apply(createdServer);

    // get server by name
    Set<Server> response = client.getServerServices().getServersByName(nameOfServer);
    assert (response.size() == 1);
    createdServer = Iterables.getOnlyElement(response);

    Map<String, Credentials> credsMap = client.getServerServices().getServerCredentialsList();
    LoginCredentials instanceCredentials =
        LoginCredentials.fromCredentials(credsMap.get(createdServer.getName()));
    assertNotNull(instanceCredentials);

    HostAndPort socket = HostAndPort.fromParts(createdServer.getIp().getIp(), 22);

    Predicate<HostAndPort> socketOpen = retry(new InetSocketAddressConnect(), 180, 5, SECONDS);

    socketOpen.apply(socket);

    SshClient sshClient =
        gocontext
            .utils()
            .injector()
            .getInstance(SshClient.Factory.class)
            .create(socket, instanceCredentials);
    sshClient.connect();
    String output = sshClient.exec("df").getOutput();
    assertTrue(
        output.contains("Filesystem"),
        "The output should've contained filesystem information, but it didn't. Output: " + output);
    sshClient.disconnect();

    // check that the get credentials call is the same as this
    assertEquals(
        client.getServerServices().getServerCredentials(createdServer.getId()),
        instanceCredentials);

    try {
      assertEquals(client.getServerServices().getServerCredentials(Long.MAX_VALUE), null);
    } catch (AssertionError e) {
      e.printStackTrace();
    }

    // delete the server
    client.getServerServices().deleteByName(nameOfServer);
  }
 @Override
 public String toString() {
   return Objects.toStringHelper("")
       .add("hostAndPort", hostAndPort)
       .add("loginUser", loginCredentials.getUser())
       .add("session", session != null ? session.hashCode() : null)
       .add("connectTimeout", connectTimeout)
       .add("sessionTimeout", sessionTimeout)
       .toString();
 }
 @Override
 protected SshClient getConnectionFor(IPSocket socket) {
   return sshFactory.create(
       socket,
       LoginCredentials.builder()
           .user("vcloud")
           .password("TmrkCl0ud1s#1!")
           .privateKey(key.getPrivateKey())
           .authenticateSudo(true)
           .build());
 }
 @Override
 public NodeMetadata apply(VirtualGuest from) {
   NodeMetadataBuilder builder = new NodeMetadataBuilder();
   builder.ids(from.getId() + "");
   builder.name(from.getHostname());
   builder.hostname(from.getFullyQualifiedDomainName());
   if (from.getDatacenter() != null) {
     builder.location(
         from(locations.get())
             .firstMatch(LocationPredicates.idEquals(from.getDatacenter().getName()))
             .orNull());
   }
   builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getHostname()));
   builder.hardware(virtualGuestToHardware.apply(from));
   Image image = virtualGuestToImage.apply(from);
   if (image != null) {
     builder.imageId(image.getId());
     builder.operatingSystem(image.getOperatingSystem());
   }
   if (from.getPowerState() != null) {
     builder.status(serverStateToNodeStatus.get(from.getPowerState().getKeyName()));
   }
   if (from.getPrimaryIpAddress() != null)
     builder.publicAddresses(ImmutableSet.of(from.getPrimaryIpAddress()));
   if (from.getPrimaryBackendIpAddress() != null)
     builder.privateAddresses(ImmutableSet.of(from.getPrimaryBackendIpAddress()));
   // TODO simplify once we move domain classes to AutoValue
   if (from.getOperatingSystem() != null
       && from.getOperatingSystem().getPasswords() != null
       && !from.getOperatingSystem().getPasswords().isEmpty()) {
     Password password = getBestPassword(from.getOperatingSystem().getPasswords(), from);
     builder.credentials(
         LoginCredentials.builder()
             .identity(password.getUsername())
             .credential(password.getPassword())
             .build());
   }
   if (from.getTagReferences() != null && !from.getTagReferences().isEmpty()) {
     List<String> tags = Lists.newArrayList();
     for (TagReference tagReference : from.getTagReferences()) {
       if (tagReference != null) {
         tags.add(tagReference.getTag().getName());
       }
     }
     builder.tags(tags);
   }
   return builder.build();
 }
 private LoginCredentials resolveNodeCredentials(Template template) {
   TemplateOptions options = template.getOptions();
   LoginCredentials.Builder credentials =
       LoginCredentials.builder(template.getImage().getDefaultCredentials());
   if (!Strings.isNullOrEmpty(options.getLoginUser())) {
     credentials.user(options.getLoginUser());
   }
   if (!Strings.isNullOrEmpty(options.getLoginPrivateKey())) {
     credentials.privateKey(options.getLoginPrivateKey());
   }
   if (!Strings.isNullOrEmpty(options.getLoginPassword())) {
     credentials.password(options.getLoginPassword());
   }
   if (options.shouldAuthenticateSudo() != null) {
     credentials.authenticateSudo(options.shouldAuthenticateSudo());
   }
   return credentials.build();
 }
Example #13
0
 @Override
 public NodeMetadata apply(Server from) {
   // convert the result object to a jclouds NodeMetadata
   NodeMetadataBuilder builder = new NodeMetadataBuilder();
   builder.ids(from.id + "");
   builder.name(from.name);
   builder.location(findLocationForServer.apply(from));
   builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.name));
   builder.imageId(from.imageId + "");
   Image image = findImageForServer.apply(from);
   if (image != null) builder.operatingSystem(image.getOperatingSystem());
   builder.hardware(findHardwareForServer.apply(from));
   builder.state(serverStatusToNodeState.get(from.status));
   builder.publicAddresses(ImmutableSet.<String>of(from.publicAddress));
   builder.privateAddresses(ImmutableSet.<String>of(from.privateAddress));
   builder.credentials(LoginCredentials.fromCredentials(credentialStore.get(from.id + "")));
   return builder.build();
 }
Example #14
0
 public JschSshClient(
     ProxyConfig proxyConfig,
     BackoffLimitedRetryHandler backoffLimitedRetryHandler,
     HostAndPort socket,
     LoginCredentials loginCredentials,
     int timeout) {
   this.user = checkNotNull(loginCredentials, "loginCredentials").getUser();
   this.host = checkNotNull(socket, "socket").getHostText();
   checkArgument(socket.getPort() > 0, "ssh port must be greater then zero" + socket.getPort());
   checkArgument(
       loginCredentials.getPassword() != null || loginCredentials.getPrivateKey() != null,
       "you must specify a password or a key");
   this.backoffLimitedRetryHandler =
       checkNotNull(backoffLimitedRetryHandler, "backoffLimitedRetryHandler");
   if (loginCredentials.getPrivateKey() == null) {
     this.toString =
         String.format(
             "%s:pw[%s]@%s:%d",
             loginCredentials.getUser(),
             base16()
                 .lowerCase()
                 .encode(md5().hashString(loginCredentials.getPassword(), UTF_8).asBytes()),
             host,
             socket.getPort());
   } else {
     String fingerPrint = fingerprintPrivateKey(loginCredentials.getPrivateKey());
     String sha1 = sha1PrivateKey(loginCredentials.getPrivateKey());
     this.toString =
         String.format(
             "%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d",
             loginCredentials.getUser(), fingerPrint, sha1, host, socket.getPort());
   }
   sessionConnection =
       SessionConnection.builder()
           .hostAndPort(HostAndPort.fromParts(host, socket.getPort()))
           .loginCredentials(loginCredentials)
           .proxy(checkNotNull(proxyConfig, "proxyConfig"))
           .connectTimeout(timeout)
           .sessionTimeout(timeout)
           .build();
 }
  @Override
  public NodeAndInitialCredentials<ServerInfo> createNodeWithGroupEncodedIntoName(
      String tag, String name, Template template) {
    long bootSize =
        (long) (template.getHardware().getVolumes().get(0).getSize() * 1024 * 1024 * 1024l);
    AffinityType affinityType = AffinityType.HDD;
    if (template.getOptions() instanceof CloudSigmaTemplateOptions) {
      CloudSigmaTemplateOptions options =
          CloudSigmaTemplateOptions.class.cast(template.getOptions());
      affinityType = options.getDiskDriveAffinity();
    }
    logger.debug(
        ">> imaging boot drive source(%s) bytes(%d) affinityType(%s)",
        template.getImage().getId(), bootSize, affinityType);
    DriveInfo drive =
        client.cloneDrive(
            template.getImage().getId(),
            template.getImage().getId(),
            new CloneDriveOptions().size(bootSize).affinity(affinityType));
    boolean success = driveNotClaimed.apply(drive);
    logger.debug("<< image(%s) complete(%s)", drive.getUuid(), success);
    if (!success) {
      client.destroyDrive(drive.getUuid());
      throw new IllegalStateException("could not image drive in time!");
    }

    Server toCreate =
        Servers.small(name, drive.getUuid(), defaultVncPassword)
            .mem(template.getHardware().getRam())
            .cpu((int) (template.getHardware().getProcessors().get(0).getSpeed()))
            .build();

    logger.debug(">> creating server");
    ServerInfo from = client.createServer(toCreate);
    logger.debug("<< created server(%s)", from.getUuid());
    logger.debug(">> starting server(%s)", from.getUuid());
    client.startServer(from.getUuid());
    return new NodeAndInitialCredentials<ServerInfo>(
        from,
        from.getUuid(),
        LoginCredentials.builder().password(defaultVncPassword).authenticateSudo(true).build());
  }
Example #16
0
  @Override
  public Image apply(DiskImage from) {
    checkNotNull(from, "disk image");

    ImageBuilder builder = new ImageBuilder();

    builder.ids(from.getId());
    builder.name(from.getName());
    builder.description(from.getDescription());
    builder.location(Iterables.getOnlyElement(regionSupplier.get()));
    // in fgcp, if the image is listed it is available
    builder.status(Status.AVAILABLE);

    OperatingSystem os = diskImageToOperatingSystem.apply(from);
    builder.operatingSystem(os);
    String user = os.getFamily() == OsFamily.WINDOWS ? "Administrator" : "root";
    builder.defaultCredentials(LoginCredentials.builder().identity(user).noPassword().build());

    return builder.build();
  }
  protected SshjSshClient createClient(final Properties props) {
    Injector i =
        Guice.createInjector(
            module(),
            new AbstractModule() {

              @Override
              protected void configure() {
                bindProperties(binder(), props);
              }
            },
            new SLF4JLoggingModule());
    SshClient.Factory factory = i.getInstance(SshClient.Factory.class);
    SshjSshClient ssh =
        SshjSshClient.class.cast(
            factory.create(
                HostAndPort.fromParts("localhost", 22),
                LoginCredentials.builder().user("username").password("password").build()));
    return ssh;
  }
 @Test(dependsOnMethods = "testCreateMachine")
 protected void testSsh() {
   String publicAddress =
       Iterables.find(machine.getIps(), not(InetAddresses2.IsPrivateIPAddress.INSTANCE));
   HostAndPort socket = HostAndPort.fromParts(publicAddress, 22);
   assertTrue(socketTester.apply(socket), socket.toString());
   SshClient api =
       context
           .utils()
           .injector()
           .getInstance(SshClient.Factory.class)
           .create(
               socket,
               LoginCredentials.builder().user("root").privateKey(key.get("private")).build());
   try {
     api.connect();
     ExecResponse exec = api.exec("echo hello");
     System.out.println(exec);
     assertEquals(exec.getOutput().trim(), "hello");
   } finally {
     if (api != null) api.disconnect();
   }
 }
 @Test(enabled = false)
 protected void tryBadPassword(String group, Credentials good) throws AssertionError {
   try {
     Map<? extends NodeMetadata, ExecResponse> responses =
         client.runScriptOnNodesMatching(
             runningInGroup(group),
             "echo I put a bad password",
             wrapInInitScript(false)
                 .runAsRoot(false)
                 .overrideLoginCredentials(
                     LoginCredentials.builder()
                         .user(good.identity)
                         .noPrivateKey()
                         .password("romeo")
                         .build()));
     assert responses.size() == 0 : "shouldn't pass with a bad password\n" + responses;
   } catch (AssertionError e) {
     throw e;
   } catch (RunScriptOnNodesException e) {
     assert Iterables.any(
             e.getNodeErrors().values(), Predicates.instanceOf(AuthorizationException.class))
         : e + " not authexception!";
   }
 }
  public void testParseRightScaleImage() {

    Set<org.jclouds.compute.domain.Image> result = convertImages("/rightscale_images.xml");

    assertEquals(
        Iterables.get(result, 0),
        new ImageBuilder()
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.CENTOS)
                    .arch("paravirtual")
                    .version("5.4")
                    .description("rightscale-us-east/CentOS_5.4_x64_v4.4.10.manifest.xml")
                    .is64Bit(true)
                    .build())
            .description("rightscale-us-east/CentOS_5.4_x64_v4.4.10.manifest.xml")
            .defaultCredentials(LoginCredentials.builder().user("root").build())
            .id("us-east-1/ami-ccb35ea5")
            .providerId("ami-ccb35ea5")
            .location(defaultLocation)
            .version("4.4.10")
            .userMetadata(ImmutableMap.of("owner", "admin", "rootDeviceType", "instance-store"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .backendStatus("available")
            .build());
    assertEquals(
        Iterables.get(result, 0).getStatus(), org.jclouds.compute.domain.Image.Status.AVAILABLE);

    assertEquals(
        new Gson().toJson(Iterables.get(result, 1)),
        "{\"operatingSystem\":{\"family\":\"UBUNTU\",\"arch\":\"paravirtual\",\"version\":\"9.10\",\"description\":\"411009282317/RightImage_Ubuntu_9.10_x64_v4.5.3_EBS_Alpha\",\"is64Bit\":true},\"status\":\"AVAILABLE\",\"backendStatus\":\"available\",\"version\":\"4.5.3_EBS_Alpha\",\"description\":\"RightImage_Ubuntu_9.10_x64_v4.5.3_EBS_Alpha\",\"defaultCredentials\":{\"authenticateSudo\":false,\"identity\":\"root\"},\"id\":\"us-east-1/ami-c19db6b5\",\"type\":\"IMAGE\",\"tags\":[],\"providerId\":\"ami-c19db6b5\",\"name\":\"RightImage_Ubuntu_9.10_x64_v4.5.3_EBS_Alpha\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\",\"iso3166Codes\":[],\"metadata\":{}},\"userMetadata\":{\"owner\":\"411009282317\",\"rootDeviceType\":\"ebs\",\"virtualizationType\":\"paravirtual\",\"hypervisor\":\"xen\"}}");

    assertEquals(
        new Gson().toJson(Iterables.get(result, 2)),
        "{\"operatingSystem\":{\"family\":\"WINDOWS\",\"arch\":\"hvm\",\"version\":\"2003\",\"description\":\"411009282317/RightImage Windows_2003_i386_v5.4.3\",\"is64Bit\":false},\"status\":\"AVAILABLE\",\"backendStatus\":\"available\",\"version\":\"5.4.3\",\"description\":\"Built by RightScale\",\"defaultCredentials\":{\"authenticateSudo\":false,\"identity\":\"root\"},\"id\":\"us-east-1/ami-710c2605\",\"type\":\"IMAGE\",\"tags\":[],\"providerId\":\"ami-710c2605\",\"name\":\"RightImage Windows_2003_i386_v5.4.3\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\",\"iso3166Codes\":[],\"metadata\":{}},\"userMetadata\":{\"owner\":\"411009282317\",\"rootDeviceType\":\"ebs\",\"virtualizationType\":\"hvm\",\"hypervisor\":\"xen\"}}");
  }
Example #21
0
 @Override
 public SshClient create(IPSocket socket, Credentials credentials) {
   return create(socket, LoginCredentials.fromCredentials(credentials));
 }
  public void testParseAmznImage() {

    Set<org.jclouds.compute.domain.Image> result = convertImages("/amzn_images.xml");

    assertEquals(
        Iterables.get(result, 0),
        new ImageBuilder()
            .name("amzn-ami-0.9.7-beta.i386-ebs")
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.AMZN_LINUX)
                    .arch("paravirtual")
                    .version("0.9.7-beta")
                    .description("137112412989/amzn-ami-0.9.7-beta.i386-ebs")
                    .is64Bit(false)
                    .build())
            .description("Amazon")
            .defaultCredentials(LoginCredentials.builder().user("ec2-user").build())
            .id("us-east-1/ami-82e4b5c7")
            .providerId("ami-82e4b5c7")
            .location(defaultLocation)
            .version("0.9.7-beta")
            .userMetadata(
                ImmutableMap.of(
                    "owner", "137112412989",
                    "rootDeviceType", "ebs",
                    "virtualizationType", "paravirtual",
                    "hypervisor", "xen"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .build());
    assertEquals(
        Iterables.get(result, 0).getStatus(), org.jclouds.compute.domain.Image.Status.AVAILABLE);

    assertEquals(
        Iterables.get(result, 3),
        new ImageBuilder()
            .name("amzn-ami-0.9.7-beta.x86_64-S3")
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.AMZN_LINUX)
                    .arch("paravirtual")
                    .version("0.9.7-beta")
                    .description("amzn-ami-us-west-1/amzn-ami-0.9.7-beta.x86_64.manifest.xml")
                    .is64Bit(true)
                    .build())
            .description("Amazon Linux AMI x86_64 S3")
            .defaultCredentials(LoginCredentials.builder().user("ec2-user").build())
            .id("us-east-1/ami-f2e4b5b7")
            .providerId("ami-f2e4b5b7")
            .location(defaultLocation)
            .version("0.9.7-beta")
            .userMetadata(
                ImmutableMap.of(
                    "owner", "137112412989",
                    "rootDeviceType", "ebs",
                    "virtualizationType", "paravirtual",
                    "hypervisor", "xen"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .build());
    assertEquals(
        Iterables.get(result, 3).getStatus(), org.jclouds.compute.domain.Image.Status.AVAILABLE);
  }
  public void testParseAlesticCanonicalImage() {

    Set<org.jclouds.compute.domain.Image> result = convertImages("/alestic_canonical.xml");

    assertEquals(
        Iterables.get(result, 0),
        new ImageBuilder()
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.UBUNTU)
                    .arch("paravirtual")
                    .version("8.04")
                    .description(
                        "ubuntu-images-us/ubuntu-hardy-8.04-i386-server-20091130.manifest.xml")
                    .is64Bit(false)
                    .build())
            .description("ubuntu-images-us/ubuntu-hardy-8.04-i386-server-20091130.manifest.xml")
            .defaultCredentials(LoginCredentials.builder().user("ubuntu").build())
            .id("us-east-1/ami-7e28ca17")
            .providerId("ami-7e28ca17")
            .location(defaultLocation)
            .version("20091130")
            .userMetadata(
                ImmutableMap.of(
                    "owner", "099720109477",
                    "rootDeviceType", "instance-store",
                    "virtualizationType", "paravirtual",
                    "hypervisor", "xen"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .backendStatus("available")
            .build());
    assertEquals(
        Iterables.get(result, 0).getStatus(), org.jclouds.compute.domain.Image.Status.AVAILABLE);

    assertEquals(
        Iterables.get(result, 4),
        new ImageBuilder()
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.UBUNTU)
                    .arch("paravirtual")
                    .version("8.04")
                    .description("alestic/ubuntu-8.04-hardy-base-20080905.manifest.xml")
                    .is64Bit(false)
                    .build())
            .description("alestic/ubuntu-8.04-hardy-base-20080905.manifest.xml")
            .defaultCredentials(LoginCredentials.builder().user("ubuntu").build())
            .id("us-east-1/ami-c0fa1ea9")
            .providerId("ami-c0fa1ea9")
            .location(defaultLocation)
            .version("20080905")
            .userMetadata(
                ImmutableMap.of("owner", "063491364108", "rootDeviceType", "instance-store"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .backendStatus("available")
            .build());
    assertEquals(
        Iterables.get(result, 4).getStatus(), org.jclouds.compute.domain.Image.Status.AVAILABLE);

    assertEquals(
        Iterables.get(result, 6),
        new ImageBuilder()
            .name("ebs/ubuntu-images/ubuntu-lucid-10.04-i386-server-20100827")
            .operatingSystem(
                new OperatingSystem.Builder()
                    .family(OsFamily.UBUNTU)
                    .arch("paravirtual")
                    .version("10.04")
                    .description(
                        "099720109477/ebs/ubuntu-images/ubuntu-lucid-10.04-i386-server-20100827")
                    .is64Bit(false)
                    .build())
            .description("099720109477/ebs/ubuntu-images/ubuntu-lucid-10.04-i386-server-20100827")
            .defaultCredentials(LoginCredentials.builder().user("ubuntu").build())
            .id("us-east-1/ami-10f3a255")
            .providerId("ami-10f3a255")
            .location(defaultLocation)
            .version("20100827")
            .userMetadata(
                ImmutableMap.of(
                    "owner", "099720109477",
                    "rootDeviceType", "ebs",
                    "virtualizationType", "paravirtual",
                    "hypervisor", "xen"))
            .status(org.jclouds.compute.domain.Image.Status.AVAILABLE)
            .backendStatus("available")
            .build());
    assertEquals(
        Iterables.get(result, 6).getStatus(), org.jclouds.compute.domain.Image.Status.AVAILABLE);
  }
  @Override
  public NodeAndInitialCredentials<Instance> createNodeWithGroupEncodedIntoName(
      String group, String name, Template template) {
    GoogleComputeEngineTemplateOptions options =
        GoogleComputeEngineTemplateOptions.class.cast(template.getOptions());

    checkNotNull(options.getNetworks(), "template options must specify a network");
    checkNotNull(template.getHardware().getUri(), "hardware must have a URI");
    checkNotNull(template.getImage().getUri(), "image URI is null");

    List<AttachDisk> disks = Lists.newArrayList();
    disks.add(AttachDisk.newBootDisk(template.getImage().getUri()));

    Iterator<String> networks = options.getNetworks().iterator();

    URI network = URI.create(networks.next());
    assert !networks.hasNext() : "Error: Options should specify only one network";

    // Add tags from template
    ArrayList<String> tags = new ArrayList<String>(options.getTags());

    // Add tags for firewalls
    FirewallTagNamingConvention naming = firewallTagNamingConvention.get(group);
    List<String> ports = simplifyPorts(options.getInboundPorts());
    if (ports != null) {
      tags.add(naming.name(ports));
    }

    NewInstance newInstance =
        new NewInstance.Builder(
                name,
                template.getHardware().getUri(), // machineType
                network,
                disks)
            .description(group)
            .tags(Tags.create(null, ImmutableList.copyOf(tags)))
            .serviceAccounts(options.serviceAccounts())
            .build();

    // Add metadata from template and for ssh key and image id
    newInstance.metadata().putAll(options.getUserMetadata());

    LoginCredentials credentials = resolveNodeCredentials(template);
    if (options.getPublicKey() != null) {
      newInstance
          .metadata()
          .put(
              "sshKeys",
              format(
                  "%s:%s %s@localhost",
                  credentials.getUser(), options.getPublicKey(), credentials.getUser()));
    }

    String zone = template.getLocation().getId();
    InstanceApi instanceApi = api.instancesInZone(zone);
    Operation create = instanceApi.create(newInstance);

    // We need to see the created instance so that we can access the newly created disk.
    AtomicReference<Instance> instance =
        Atomics.newReference(
            Instance.create( //
                "0000000000000000000", // id can't be null, but isn't available until provisioning
                                       // is done.
                null, // creationTimestamp
                create.targetLink(), // selfLink
                newInstance.name(), // name
                newInstance.description(), // description
                newInstance.tags(), // tags
                newInstance.machineType(), // machineType
                Instance.Status.PROVISIONING, // status
                null, // statusMessage
                create.zone(), // zone
                null, // canIpForward
                null, // networkInterfaces
                null, // disks
                newInstance.metadata(), // metadata
                newInstance.serviceAccounts(), // serviceAccounts
                Scheduling.create(OnHostMaintenance.MIGRATE, true) // scheduling
                ));
    checkState(instanceVisible.apply(instance), "instance %s is not api visible!", instance.get());

    // Add lookup for InstanceToNodeMetadata
    diskToSourceImage.put(instance.get().disks().get(0).source(), template.getImage().getUri());

    return new NodeAndInitialCredentials<Instance>(
        instance.get(), instance.get().selfLink().toString(), credentials);
  }
  // TODO: finish me!
  @Test(enabled = false)
  public void
      testCreateNodeUsingVCloud1_0ApiAgainstVCloudDirector1_5WhenVAppTemplateHasNetworkNamedNone()
          throws Exception {

    String group = "group";
    String name = "group-abcd";

    String instantiateXML =
        XMLBuilder.create("InstantiateVAppTemplateParams")
            .a("xmlns", ns)
            .a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1")
            .a("deploy", "false")
            .a("name", name)
            .a("powerOn", "false")
            .e("Description")
            .up()
            .e("InstantiationParams")
            .e("NetworkConfigSection")
            .e("ovf:Info")
            .t("Configuration parameters for logical networks")
            .up()
            .e("NetworkConfig")
            .a("networkName", "orgNet-jclouds-External") // NOTE not "None"
            .e("Configuration")
            .e("ParentNetwork")
            .a("href", ENDPOINT + "/v1.0/network/" + networkId)
            .up()
            .e("FenceMode")
            .t("bridged")
            .up()
            .up()
            .up()
            .up()
            .up()
            .e("Source")
            .a("href", ENDPOINT + "/v1.0/vAppTemplate/" + templateId)
            .up()
            .e("AllEULAsAccepted")
            .t("true")
            .up()
            .asString(outputProperties);

    HttpRequest version1_0InstantiateWithNetworkNamedSameAsOrgNetwork =
        HttpRequest.builder()
            .method("POST")
            .endpoint(ENDPOINT + "/v1.0/vdc/" + vdcId + "/action/instantiateVAppTemplate")
            .addHeader(HttpHeaders.ACCEPT, "application/vnd.vmware.vcloud.vApp+xml")
            .addHeader("x-vcloud-authorization", sessionToken)
            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken)
            .payload(
                payloadFromStringWithContentType(
                    instantiateXML,
                    "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml"))
            .build();

    ComputeService compute =
        requestsSendResponses(
            ImmutableMap.<HttpRequest, HttpResponse>builder()
                .put(versionsRequest, versionsResponseFromVCD1_5)
                .put(
                    version1_0LoginRequest,
                    successfulVersion1_0LoginResponseFromVCD1_5WithSingleOrg)
                .put(
                    version1_0GetOrgRequest,
                    successfulVersion1_0GetOrgResponseFromVCD1_5WithSingleTasksListVDCAndNetwork)
                .put(
                    version1_0GetCatalogRequest,
                    successfulVersion1_0GetCatalogResponseFromVCD1_5WithSingleTemplate)
                .put(
                    version1_0GetCatalogItemRequest,
                    successfulVersion1_0GetCatalogItemResponseFromVCD1_5ForTemplate)
                .put(
                    version1_0GetVDCRequest,
                    successfulVersion1_0GetVDCResponseFromVCD1_5WithSingleTemplateAndNetwork)
                .put(
                    version1_0GetVAppTemplateRequest,
                    successfulVersion1_0GetVAppTemplateResponseFromVCD1_5WithSingleVMAndVDCParent)
                .put(
                    version1_0GetOVFForVAppTemplateRequest,
                    successfulVersion1_0GetOVFForVAppTemplateResponseFromVCD1_5WithSingleVM)
                .put(
                    version1_0InstantiateWithNetworkNamedSameAsOrgNetwork,
                    successfulVersion1_0InstantiatedVApp)
                .build());

    InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn starter =
        compute
            .getContext()
            .utils()
            .injector()
            .getInstance(
                InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.class);

    NodeAndInitialCredentials<VApp> appAndCreds =
        starter.createNodeWithGroupEncodedIntoName(group, name, compute.templateBuilder().build());

    assertEquals(appAndCreds.getNode().getName(), name);
    assertEquals(
        appAndCreds.getCredentials(),
        LoginCredentials.builder().user("root").password("fromVApp").build());
  }
 protected void addCredentialsForInstance(NodeMetadataBuilder builder, RunningInstance instance) {
   builder.credentials(
       LoginCredentials.fromCredentials(
           credentialStore.get("node#" + instance.getRegion() + "/" + instance.getId())));
 }
 protected LoginCredentials getSshCredentials(Server server) {
   return LoginCredentials.builder().user("toor").password(server.getVnc().getPassword()).build();
 }
 @Provides
 @Singleton
 protected Map<OsFamily, LoginCredentials> osFamilyToCredentials(Injector injector) {
   return ImmutableMap.of(
       OsFamily.WINDOWS, LoginCredentials.builder().user("Administrator").build());
 }
  protected NodeAndInitialCredentials<ServerInDataCenter> createNodeWithGroupEncodedIntoName(
      String group, String name, TemplateWithDataCenter template) {
    checkArgument(
        template.getLocation().getScope() == LocationScope.ZONE,
        "Template must use a ZONE-scoped location");
    final String dataCenterId = template.getDataCenter().id();
    Hardware hardware = template.getHardware();
    TemplateOptions options = template.getOptions();
    final String loginUser =
        isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser();
    final String password =
        options.hasLoginPassword() ? options.getLoginPassword() : Passwords.generate();
    final org.jclouds.compute.domain.Image image = template.getImage();

    // provision all volumes based on hardware
    List<? extends Volume> volumes = hardware.getVolumes();
    List<String> volumeIds = Lists.newArrayListWithExpectedSize(volumes.size());

    int i = 1;
    for (final Volume volume : volumes) {
      try {
        logger.trace("<< provisioning volume '%s'", volume);
        final org.apache.jclouds.profitbricks.rest.domain.Volume.Request.CreatePayload.Builder
            request = org.apache.jclouds.profitbricks.rest.domain.Volume.Request.creatingBuilder();
        if (i == 1) {
          request.image(image.getId());
          // we don't need to pass password to the API if we're using a snapshot
          Provisionable.Type provisionableType =
              Provisionable.Type.fromValue(
                  image.getUserMetadata().get(ProvisionableToImage.KEY_PROVISIONABLE_TYPE));
          if (provisionableType == Provisionable.Type.IMAGE) {
            request.imagePassword(password);
          }
        }
        request
            .dataCenterId(dataCenterId)
            .name(format("%s-disk-%d", name, i++))
            .size(volume.getSize().intValue())
            .type(VolumeType.HDD);

        org.apache.jclouds.profitbricks.rest.domain.Volume vol =
            (org.apache.jclouds.profitbricks.rest.domain.Volume)
                provisioningManager.provision(
                    jobFactory.create(
                        dataCenterId,
                        new Supplier<Object>() {
                          @Override
                          public Object get() {
                            return api.volumeApi().createVolume(request.build());
                          }
                        }));

        volumeIds.add(vol.id());
        logger.trace(">> provisioning complete for volume. returned id='%s'", vol.id());
      } catch (Exception ex) {
        if (i - 1 == 1) // if first volume (one with image) provisioning fails; stop method
        {
          throw Throwables.propagate(ex);
        }
        logger.warn(ex, ">> failed to provision volume. skipping..");
      }
    }

    String volumeBootDeviceId = Iterables.get(volumeIds, 0); // must have atleast 1
    waitVolumeUntilAvailable.apply(VolumeRef.create(dataCenterId, volumeBootDeviceId));

    // provision server
    final Server server;
    Double cores = ComputeServiceUtils.getCores(hardware);

    Server.BootVolume bootVolume = Server.BootVolume.create(volumeBootDeviceId);

    try {
      final Server.Request.CreatePayload serverRequest =
          Server.Request.creatingBuilder()
              .dataCenterId(dataCenterId)
              .name(name)
              .bootVolume(bootVolume)
              .cores(cores.intValue())
              .ram(hardware.getRam())
              .build();

      logger.trace("<< provisioning server '%s'", serverRequest);

      server =
          (Server)
              provisioningManager.provision(
                  jobFactory.create(
                      dataCenterId,
                      new Supplier<Object>() {

                        @Override
                        public Object get() {
                          return api.serverApi().createServer(serverRequest);
                        }
                      }));
      logger.trace(">> provisioning complete for server. returned id='%s'", server.id());

    } catch (Exception ex) {
      logger.error(ex, ">> failed to provision server. rollbacking..");
      destroyVolumes(volumeIds, dataCenterId);
      throw Throwables.propagate(ex);
    }

    waitServerUntilAvailable.apply(ServerRef.create(dataCenterId, server.id()));
    waitDcUntilAvailable.apply(dataCenterId);

    // attach bootVolume to Server
    org.apache.jclouds.profitbricks.rest.domain.Volume volume =
        api.serverApi()
            .attachVolume(
                Server.Request.attachVolumeBuilder()
                    .dataCenterId(dataCenterId)
                    .serverId(server.id())
                    .volumeId(bootVolume.id())
                    .build());

    trackables.waitUntilRequestCompleted(volume);
    waitServerUntilAvailable.apply(ServerRef.create(dataCenterId, server.id()));
    waitDcUntilAvailable.apply(dataCenterId);

    // fetch an existing lan and creat if non was found
    Lan lan = null;

    List<Lan> lans = api.lanApi().list(dataCenterId);
    if (lans != null && !lans.isEmpty()) {
      lan =
          FluentIterable.from(lans)
              .firstMatch(
                  new Predicate<Lan>() {
                    @Override
                    public boolean apply(Lan input) {
                      input =
                          api.lanApi().get(dataCenterId, input.id(), new DepthOptions().depth(3));
                      return input.properties().isPublic();
                    }
                  })
              .orNull();
    }
    if (lan == null) {
      logger.warn("Could not find an existing lan Creating one....");
      lan =
          api.lanApi()
              .create(
                  Lan.Request.creatingBuilder()
                      .dataCenterId(dataCenterId)
                      .isPublic(Boolean.TRUE)
                      .name("lan " + name)
                      .build());
      trackables.waitUntilRequestCompleted(lan);
    }

    // add a NIC to the server
    int lanId = DEFAULT_LAN_ID;
    if (options.getNetworks() != null) {
      try {
        String networkId = Iterables.get(options.getNetworks(), 0);
        lanId = Integer.valueOf(networkId);
      } catch (Exception ex) {
        logger.warn(
            "no valid network id found from options. using default id='%d'", DEFAULT_LAN_ID);
      }
    }

    Nic nic =
        api.nicApi()
            .create(
                Nic.Request.creatingBuilder()
                    .dataCenterId(dataCenterId)
                    .name("jclouds" + name)
                    .dhcp(Boolean.TRUE)
                    .lan(lanId)
                    .firewallActive(Boolean.FALSE)
                    .serverId(server.id())
                    .build());

    trackables.waitUntilRequestCompleted(nic);
    waitNICUntilAvailable.apply(NicRef.create(dataCenterId, server.id(), nic.id()));
    waitDcUntilAvailable.apply(dataCenterId);
    waitServerUntilAvailable.apply(ServerRef.create(dataCenterId, server.id()));

    // connect the rest of volumes to server;delete if fails
    final int volumeCount = volumeIds.size();
    for (int j = 1; j < volumeCount; j++) { // skip first; already connected
      final String volumeId = volumeIds.get(j);
      try {
        logger.trace("<< connecting volume '%s' to server '%s'", volumeId, server.id());
        provisioningManager.provision(
            jobFactory.create(
                group,
                new Supplier<Object>() {

                  @Override
                  public Object get() {
                    return api.serverApi()
                        .attachVolume(
                            Server.Request.attachVolumeBuilder()
                                .dataCenterId(dataCenterId)
                                .serverId(server.id())
                                .volumeId(volumeId)
                                .build());
                  }
                }));

        logger.trace(">> volume connected.");
      } catch (Exception ex) {
        try {
          // delete unconnected volume
          logger.warn(ex, ">> failed to connect volume '%s'. deleting..", volumeId);
          destroyVolume(volumeId, dataCenterId);
          logger.warn(ex, ">> rolling back server..", server.id());
          destroyServer(server.id(), dataCenterId);
          throw ex;
        } catch (Exception ex1) {
          logger.error(ex, ">> failed to rollback");
        }
      }
    }
    waitDcUntilAvailable.apply(dataCenterId);
    waitServerUntilAvailable.apply(ServerRef.create(dataCenterId, server.id()));

    LoginCredentials serverCredentials =
        LoginCredentials.builder().user(loginUser).password(password).build();

    String serverInDataCenterId =
        DataCenterAndId.fromDataCenterAndId(dataCenterId, server.id()).slashEncode();
    ServerInDataCenter serverInDatacenter = getNode(serverInDataCenterId);

    return new NodeAndInitialCredentials<ServerInDataCenter>(
        serverInDatacenter, serverInDataCenterId, serverCredentials);
  }
Example #30
-1
 @Override
 public Session create() throws Exception {
   JSch jsch = new JSch();
   session =
       jsch.getSession(
           loginCredentials.getUser(),
           hostAndPort.getHostText(),
           hostAndPort.getPortOrDefault(22));
   if (sessionTimeout != 0) session.setTimeout(sessionTimeout);
   if (loginCredentials.getPrivateKey() == null) {
     session.setPassword(loginCredentials.getPassword());
   } else {
     byte[] privateKey = loginCredentials.getPrivateKey().getBytes();
     if (CredentialUtils.isPrivateKeyEncrypted(privateKey)) {
       throw new IllegalArgumentException(
           "JschSshClientModule does not support private keys that require a passphrase");
     }
     jsch.addIdentity(
         loginCredentials.getUser(),
         Arrays.copyOf(privateKey, privateKey.length),
         null,
         emptyPassPhrase);
   }
   java.util.Properties config = new java.util.Properties();
   config.put("StrictHostKeyChecking", "no");
   session.setConfig(config);
   session.connect(connectTimeout);
   return session;
 }