All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jclouds.profitbricks.rest.compute.function.ServerInDataCenterToNodeMetadata Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.jclouds.profitbricks.rest.compute.function;

import shaded.com.google.common.base.Function;
import static shaded.com.google.common.base.Preconditions.checkNotNull;
import static shaded.com.google.common.base.Predicates.not;
import shaded.com.google.common.base.Supplier;
import shaded.com.google.common.collect.Iterables;
import static shaded.com.google.common.collect.Iterables.find;
import shaded.com.google.common.collect.Lists;
import shaded.com.google.inject.Inject;
import java.util.List;
import java.util.Set;
import org.apache.jclouds.profitbricks.rest.ProfitBricksApi;
import org.apache.jclouds.profitbricks.rest.domain.DataCenter;
import org.apache.jclouds.profitbricks.rest.domain.LicenceType;
import org.apache.jclouds.profitbricks.rest.domain.Nic;
import org.apache.jclouds.profitbricks.rest.domain.Server;
import org.apache.jclouds.profitbricks.rest.domain.zonescoped.ServerInDataCenter;
import org.jclouds.collect.Memoized;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.HardwareBuilder;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Processor;
import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.functions.GroupNamingConvention;
import org.jclouds.domain.Location;
import static org.jclouds.location.predicates.LocationPredicates.idEquals;
import org.jclouds.util.InetAddresses2;

public class ServerInDataCenterToNodeMetadata implements Function {

   private final Function fnVolume;
   private final Supplier> locations;
   private final Function, List> fnCollectIps;
   private final ProfitBricksApi api;

   private final GroupNamingConvention groupNamingConvention;

   @Inject
   public ServerInDataCenterToNodeMetadata(Function fnVolume,
           @Memoized Supplier> locations,
           ProfitBricksApi api,
           GroupNamingConvention.Factory groupNamingConvention) {
      this.fnVolume = fnVolume;
      this.locations = locations;
      this.api = api;
      this.groupNamingConvention = groupNamingConvention.createWithoutPrefix();
      this.fnCollectIps = new Function, List>() {
         @Override
         public List apply(List in) {
            List ips = Lists.newArrayListWithExpectedSize(in.size());
            for (Nic nic : in) {
               ips.addAll(nic.properties().ips());
            }
            return ips;
         }
      };
   }

   @Override
   public NodeMetadata apply(final ServerInDataCenter serverInDataCenter) {
      Server server = serverInDataCenter.getServer();
      checkNotNull(server, "Null server");

      // Location is not populated in the datacenter on a server response
      DataCenter dataCenter = api.dataCenterApi().getDataCenter(serverInDataCenter.getDataCenter());
      Location location = find(locations.get(), idEquals(dataCenter.properties().location().getId()));

      float size = 0f;
      List volumes = Lists.newArrayList();
      List storages = server.entities().volumes().items();
      if (storages != null) {
         for (org.apache.jclouds.profitbricks.rest.domain.Volume storage : storages) {
            size += storage.properties().size();
            volumes.add(fnVolume.apply(storage));
         }
      }

      // Build hardware
      String id = String.format("cpu=%d,ram=%d,disk=%.0f", server.properties().cores(), server.properties().ram(), size);
      Hardware hardware = new HardwareBuilder()
              .ids(id)
              .name(id)
              .ram(server.properties().ram())
              .processor(new Processor(server.properties().cores(), 1d))
              .hypervisor("kvm")
              .volumes(volumes)
              .location(location)
              .build();

      // Collect ips
      List addresses = fnCollectIps.apply(server.entities().nics().items());
      OperatingSystem os = null;
      if (server.properties() != null && server.properties().bootVolume() != null && server.properties().bootVolume().properties() != null) {
         os = mapOsType(server.properties().bootVolume().properties().licenceType());

      }
      // Build node
      NodeMetadataBuilder nodeBuilder = new NodeMetadataBuilder();
      nodeBuilder.ids(serverInDataCenter.slashEncode())
              .group(groupNamingConvention.extractGroup(server.properties().name()))
              .name(server.properties().name())
              .backendStatus(server.metadata().state().toString())
              .status(mapStatus(server.properties().vmState()))
              .hardware(hardware)
              .operatingSystem(os)
              .location(location)
              .privateAddresses(Iterables.filter(addresses, InetAddresses2.IsPrivateIPAddress.INSTANCE))
              .publicAddresses(Iterables.filter(addresses, not(InetAddresses2.IsPrivateIPAddress.INSTANCE)));

      return nodeBuilder.build();
   }

   static NodeMetadata.Status mapStatus(Server.Status status) {
      if (status == null) {
         return NodeMetadata.Status.UNRECOGNIZED;
      }
      switch (status) {
         case SHUTDOWN:
         case SHUTOFF:
         case PAUSED:
            return NodeMetadata.Status.SUSPENDED;
         case RUNNING:
            return NodeMetadata.Status.RUNNING;
         case BLOCKED:
            return NodeMetadata.Status.PENDING;
         case CRASHED:
            return NodeMetadata.Status.ERROR;
         default:
            return NodeMetadata.Status.UNRECOGNIZED;
      }
   }

   static OperatingSystem mapOsType(LicenceType osType) {
      if (osType != null) {
         switch (osType) {
            case WINDOWS:
               return OperatingSystem.builder()
                       .description(OsFamily.WINDOWS.value())
                       .family(OsFamily.WINDOWS)
                       .build();
            case LINUX:
               return OperatingSystem.builder()
                       .description(OsFamily.LINUX.value())
                       .family(OsFamily.LINUX)
                       .build();
            default:
               break;
         }
      }
      return OperatingSystem.builder()
              .description(OsFamily.UNRECOGNIZED.value())
              .family(OsFamily.UNRECOGNIZED)
              .build();
   }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy