org.jclouds.profitbricks.compute.function.ServerToNodeMetadata.java Source code

Java tutorial

Introduction

Here is the source code for org.jclouds.profitbricks.compute.function.ServerToNodeMetadata.java

Source

/*
 * 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.jclouds.profitbricks.compute.function;

import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Iterables.find;
import static org.jclouds.location.predicates.LocationPredicates.idEquals;

import java.util.List;
import java.util.Set;

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 org.jclouds.profitbricks.ProfitBricksApi;
import org.jclouds.profitbricks.domain.DataCenter;
import org.jclouds.profitbricks.domain.Nic;
import org.jclouds.profitbricks.domain.OsType;
import org.jclouds.profitbricks.domain.Server;
import org.jclouds.profitbricks.domain.Storage;
import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;

import com.google.common.base.Function;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.inject.Inject;

public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {

    private final Function<Storage, Volume> fnVolume;
    private final Supplier<Set<? extends Location>> locations;
    private final Function<List<Nic>, List<String>> fnCollectIps;
    private final ProfitBricksApi api;

    private final GroupNamingConvention groupNamingConvention;

    @Inject
    ServerToNodeMetadata(Function<Storage, Volume> fnVolume, @Memoized Supplier<Set<? extends Location>> locations,
            ProfitBricksApi api, GroupNamingConvention.Factory groupNamingConvention) {
        this.fnVolume = fnVolume;
        this.locations = locations;
        this.api = api;
        this.groupNamingConvention = groupNamingConvention.createWithoutPrefix();
        this.fnCollectIps = new Function<List<Nic>, List<String>>() {
            @Override
            public List<String> apply(List<Nic> in) {
                List<String> ips = Lists.newArrayListWithExpectedSize(in.size());
                for (Nic nic : in)
                    ips.addAll(nic.ips());
                return ips;
            }
        };
    }

    @Override
    public NodeMetadata apply(final Server server) {
        checkNotNull(server, "Null server");
        // Location is not populated in the datacenter on a server response
        DataCenter dataCenter = api.dataCenterApi().getDataCenter(server.dataCenter().id());
        Location location = find(locations.get(), idEquals(dataCenter.location().getId()));

        float size = 0f;
        List<Volume> volumes = Lists.newArrayList();
        List<Storage> storages = server.storages();
        if (storages != null)
            for (Storage storage : storages) {
                size += storage.size();
                volumes.add(fnVolume.apply(storage));
            }

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

        // Collect ips
        List<String> addresses = fnCollectIps.apply(server.nics());

        // Build node
        NodeMetadataBuilder nodeBuilder = new NodeMetadataBuilder();
        nodeBuilder.ids(server.id()).group(groupNamingConvention.extractGroup(server.name()))
                .hostname(server.hostname()).name(server.name()).backendStatus(server.state().toString())
                .status(mapStatus(server.status())).hardware(hardware).operatingSystem(mapOsType(server.osType()))
                .location(location).privateAddresses(Iterables.filter(addresses, IsPrivateIPAddress.INSTANCE))
                .publicAddresses(Iterables.filter(addresses, not(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(OsType 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();
            }
        return OperatingSystem.builder().description(OsFamily.UNRECOGNIZED.value()).family(OsFamily.UNRECOGNIZED)
                .build();
    }

}