org.jclouds.nodepool.config.BindBackendComputeService.java Source code

Java tutorial

Introduction

Here is the source code for org.jclouds.nodepool.config.BindBackendComputeService.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.nodepool.config;

import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static org.jclouds.nodepool.config.NodePoolProperties.BACKEND_GROUP;

import java.net.URI;
import java.util.Properties;
import java.util.Set;

import javax.inject.Named;
import javax.inject.Singleton;

import org.jclouds.ContextBuilder;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.HardwareBuilder;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.Image.Status;
import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.domain.TemplateBuilderSpec;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.compute.predicates.NodePredicates;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.jclouds.internal.FilterStringsBoundToInjectorByName;
import org.jclouds.lifecycle.Closer;
import org.jclouds.location.Provider;
import org.jclouds.nodepool.Backend;
import org.jclouds.rest.annotations.ApiVersion;
import org.jclouds.rest.annotations.BuildVersion;
import org.jclouds.util.Predicates2;

import com.google.common.annotations.Beta;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.inject.Exposed;
import com.google.inject.Module;
import com.google.inject.Provides;

public class BindBackendComputeService extends BindJcloudsModules {

    @Provides
    @Singleton
    @Backend
    protected String provideBackendProvider(@Named(NodePoolProperties.BACKEND_PROVIDER) String provider) {
        return provider;
    }

    // things wrapped in suppliers are intentional. They can cause network i/o
    // and shouldn't be invoked until after the injector is created.

    @Provides
    @Singleton
    @Backend
    @Exposed
    protected Supplier<ComputeService> makeBackendComputeService(@Backend final String provider,
            @Backend final Set<Module> modules, @Provider final Supplier<Credentials> creds,
            @Backend final Supplier<Properties> overrides, final Closer closer) {
        return Suppliers.memoize(new Supplier<ComputeService>() {

            @Override
            public ComputeService get() {
                Credentials currentCreds = checkNotNull(creds.get(), "credential supplier returned null");
                ComputeServiceContext ctx = ContextBuilder.newBuilder(provider)
                        .credentials(currentCreds.identity, currentCreds.credential).overrides(overrides.get())
                        .modules(modules).buildView(ComputeServiceContext.class);
                closer.addToClose(ctx);
                return ctx.getComputeService();
            }

        });
    }

    private static final Predicate<String> keys = Predicates.<String>and(
            Predicates.not(Predicates2.startsWith("jclouds.nodepool")),
            Predicates.not(Predicates2.startsWith("nodepool")));

    @Provides
    @Singleton
    @Backend
    protected Supplier<Properties> propertiesFor(final FilterStringsBoundToInjectorByName filterStringsBoundByName,
            @Backend final String provider, @Provider final Supplier<URI> endpoint,
            @ApiVersion final String apiVersion, @BuildVersion final String buildVersion) {
        return Suppliers.memoize(new Supplier<Properties>() {

            @Override
            public Properties get() {
                Properties props = new Properties();
                props.putAll(filterStringsBoundByName.apply(keys));
                props.put(provider + ".endpoint", endpoint.get().toASCIIString());
                props.put(provider + ".api-version", apiVersion);
                props.put(provider + ".build-version", buildVersion);
                return props;
            }

        });
    }

    @Provides
    @Exposed
    @Singleton
    protected TemplateBuilder templateBuilder(@Backend final Supplier<ComputeService> compute,
            @Backend final Supplier<Template> template) {
        try {
            // if the backend cannot provide a decent template we'll have problems with looking for
            // images, just provide a custom templatebuilder that returns our custom template.
            compute.get().templateBuilder().build();
            return compute.get().templateBuilder();
        } catch (Exception e) {
            return new TemplateBuilder() {

                @Override
                public TemplateBuilder smallest() {
                    return this;
                }

                @Override
                public TemplateBuilder osVersionMatches(String osVersionRegex) {
                    return this;
                }

                @Override
                public TemplateBuilder osNameMatches(String osNameRegex) {
                    return this;
                }

                @Override
                public TemplateBuilder osFamily(OsFamily os) {
                    return this;
                }

                @Override
                public TemplateBuilder osDescriptionMatches(String osDescriptionRegex) {
                    return this;
                }

                @Override
                public TemplateBuilder osArchMatches(String architecture) {
                    return this;
                }

                @Override
                public TemplateBuilder os64Bit(boolean is64bit) {
                    return this;
                }

                @Override
                public TemplateBuilder options(TemplateOptions options) {
                    return this;
                }

                @Override
                public TemplateBuilder minRam(int megabytes) {
                    return this;
                }

                @Override
                public TemplateBuilder minDisk(double gigabytes) {
                    return this;
                }

                @Override
                public TemplateBuilder minCores(double minCores) {
                    return this;
                }

                @Override
                public TemplateBuilder locationId(String locationId) {
                    return this;
                }

                @Override
                public TemplateBuilder imageVersionMatches(String imageVersionRegex) {
                    return this;
                }

                @Override
                public TemplateBuilder imageNameMatches(String imageNameRegex) {
                    return this;
                }

                @Override
                public TemplateBuilder imageMatches(Predicate<Image> condition) {
                    return this;
                }

                @Override
                public TemplateBuilder imageId(String imageId) {
                    return this;
                }

                @Override
                public TemplateBuilder imageDescriptionMatches(String imageDescriptionRegex) {
                    return this;
                }

                @Override
                public TemplateBuilder hypervisorMatches(String hypervisorRegex) {
                    return this;
                }

                @Override
                public TemplateBuilder hardwareId(String hardwareId) {
                    return this;
                }

                @Override
                public TemplateBuilder fromTemplate(Template image) {
                    return this;
                }

                @Override
                public TemplateBuilder fromImage(Image image) {
                    return this;
                }

                @Override
                public TemplateBuilder fromHardware(Hardware hardware) {
                    return this;
                }

                @Override
                @Beta
                public TemplateBuilder from(String spec) {
                    return this;
                }

                @Override
                @Beta
                public TemplateBuilder from(TemplateBuilderSpec spec) {
                    return this;
                }

                @Override
                public TemplateBuilder fastest() {
                    return this;
                }

                @Override
                public Template build() {
                    return template.get();
                }

                @Override
                public TemplateBuilder biggest() {
                    return this;
                }

                @Override
                public TemplateBuilder any() {
                    return this;
                }
            };
        }
    }

    @Provides
    @Singleton
    @Backend
    @Exposed
    protected Supplier<Template> makeBackendTemplate(@Backend Supplier<ComputeService> compute,
            @Named(BACKEND_GROUP) final String poolGroupPrefix) {
        return Suppliers.memoize(Suppliers.compose(new Function<ComputeService, Template>() {
            @Override
            public Template apply(ComputeService input) {
                try {
                    return input.templateBuilder().build();
                } catch (IllegalStateException e) {
                    // if there's no template we must be on byon and there must be at least one node in
                    // our group
                    Set<? extends NodeMetadata> nodes = Sets.filter(
                            input.listNodesDetailsMatching(NodePredicates.all()),
                            NodePredicates.inGroup(poolGroupPrefix));
                    checkState(!nodes.isEmpty(),
                            "service provided no template and no node was in this nodepool's group.");
                    final NodeMetadata node = Iterables.get(nodes, 0);
                    final Image image = new ImageBuilder().id(node.getId()).location(node.getLocation())
                            .operatingSystem(node.getOperatingSystem()).status(Status.AVAILABLE)
                            .description("physical node").build();
                    final Hardware hardware = new HardwareBuilder().id(node.getId()).build();
                    return new Template() {

                        @Override
                        public Image getImage() {
                            return image;
                        }

                        @Override
                        public Hardware getHardware() {
                            return hardware;
                        }

                        @Override
                        public Location getLocation() {
                            return node.getLocation();
                        }

                        @Override
                        public TemplateOptions getOptions() {
                            return new TemplateOptions();
                        }

                        @Override
                        public Template clone() {
                            return this;
                        }
                    };
                }
            }

        }, compute));
    }
}