Package org.jclouds.nodepool.config

Source Code of org.jclouds.nodepool.config.BindBackendComputeService

/*
* 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));
   }
}
TOP

Related Classes of org.jclouds.nodepool.config.BindBackendComputeService

TOP
Copyright © 2018 www.massapi.com. 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.