blob: fe060cb703f86b13add7070b3012a82e8d1f6299 [file] [log] [blame]
/*
* 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.brooklyn.core.location.dynamic.clocker;
import java.util.List;
import org.apache.brooklyn.api.entity.Application;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.ImplementedBy;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.api.sensor.AttributeSensor;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.entity.trait.Startable;
import org.apache.brooklyn.core.location.dynamic.LocationOwner;
import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
import org.apache.brooklyn.core.sensor.Sensors;
import org.apache.brooklyn.entity.group.DynamicCluster;
import org.apache.brooklyn.entity.group.DynamicGroup;
import org.apache.brooklyn.entity.group.DynamicMultiGroup;
/**
* These entities and locations mirror the structure used in Clocker v1 (prepend everything
* with "Docker" instead of "Stub"). The purpose of repeating it here is to ensure that the
* functionality Clocker is relying on will get regularly tested and kept working - or if it
* does change, then Clocker can be updated as appropriate.
*
* The Clocker hierarchy has the following structure:
*
* <pre>
* Infrastructure -----------> InfrastructureLocation
* | |
* Host -----------> HostLocation
* | |
* Container -----------> ContainerLocation
* <pre>
*
* The Infrastructure, Host and Container are all entities that implement {@link LocationOwner}.
* Whenever one of these is started, it creates the corresponding Location object (shown on the
* right).
*
* The Infrastructure has a cluster of Host instances. A host has a cluster of Container
* instances.
*
* When the {@code Infrastructure} is initially provisioned, it registers the newly create
* location in the {@link ManagementContext#getLocationRegistry()}. This makes it a named
* location, which can be used by other apps.
*
* When {@code InfrastructureLocation.obtain()) is called, it will create a container somewhere in
* the cluster. The following chain of events happens:
* <ol>
* <li>From the {@code Infrastructure} (i.e. the location's "owner"), get the set of
* {@code Host}s and thus the set of {@code HostLocation}s.
* <li>Choose a {@code HostLocation}
* (if there's not one, consider scaling up the {@code Infrastructure}'s cluster, if permitted)
* <li>Delegate to {@code DockerHostLocation.obtain()}, and return the result.
* <li>The {@code DockerHostLocation} first does some fiddly Docker stuff around images
* (not represented in this stub structure).
* <li>Get the {@code dockerHost.getDockerContainerCluster()}, and use that to create a new
* {@code Container} entity.
* <li>Invoke {@code start} effector on the {@code Container} entity
* <li>The {code Container.start} calls {@code Container.createLocation}, which instantiates
* the actual Docker container (by using the jclouds provider).
* <li>Return the {@code container.getDynamicLocation()} (i.e. the {@code ContainerLocation}).
* <ul>
*/
@ImplementedBy(StubInfrastructureImpl.class)
public interface StubInfrastructure extends Application, Startable, LocationOwner<StubInfrastructureLocation, StubInfrastructure> {
AttributeSensorAndConfigKey<String, String> LOCATION_NAME = ConfigKeys.newSensorAndConfigKeyWithDefault(LocationOwner.LOCATION_NAME, "my-stub-cloud");
ConfigKey<Integer> DOCKER_HOST_CLUSTER_MIN_SIZE = ConfigKeys.newConfigKeyWithPrefix("docker.host.", DynamicCluster.INITIAL_SIZE);
AttributeSensor<DynamicCluster> DOCKER_HOST_CLUSTER = Sensors.newSensor(DynamicCluster.class, "docker.hosts", "Docker host cluster");
AttributeSensor<DynamicGroup> DOCKER_CONTAINER_FABRIC = Sensors.newSensor(DynamicGroup.class, "docker.fabric", "Docker container fabric");
AttributeSensor<DynamicMultiGroup> DOCKER_APPLICATIONS = Sensors.newSensor(DynamicMultiGroup.class, "docker.buckets", "Docker applications");
List<Entity> getStubHostList();
DynamicCluster getStubHostCluster();
}