use of org.platformlayer.ops.OpsProvider in project platformlayer by platformlayer.
the class DirectPublicPorts method addChildren.
@Override
protected void addChildren() throws OpsException {
final CloudInstanceMapper cloudHost;
{
cloudHost = injected(CloudInstanceMapper.class);
cloudHost.createInstance = false;
cloudHost.instance = backendItem;
addChild(cloudHost);
}
final SocketAddressPoolAssignment assignPublicAddress;
{
assignPublicAddress = cloudHost.addChild(SocketAddressPoolAssignment.class);
assignPublicAddress.holder = backendItem.getKey();
if (Objects.equal(transport, Transport.Ipv6)) {
assignPublicAddress.poolProvider = new OpsProvider<ResourcePool<InetSocketAddress>>() {
@Override
public ResourcePool<InetSocketAddress> get() throws OpsException {
final ResourcePool<AddressModel> pool = directCloudHelpers.getAddressPool6().get();
return new AssignPortToAddressPool(pool, publicPort);
}
};
} else {
List<Integer> publicPortCluster = this.publicPortCluster;
if (publicPortCluster == null) {
publicPortCluster = Lists.newArrayList();
publicPortCluster.add(publicPort);
}
if (!publicPortCluster.contains(publicPort)) {
throw new OpsException("Port set specified, but public port not in the set");
}
assignPublicAddress.poolProvider = directCloudHelpers.getPublicAddressPool4(publicPort, publicPortCluster);
}
}
if (Objects.equal(transport, Transport.Ipv6)) {
// TODO: Do we need separate frontend / backend ports really?
if (this.publicPort != this.backendPort) {
throw new UnsupportedOperationException();
}
} else {
for (Protocol protocol : Protocol.TcpAndUdp()) {
IptablesForwardPort forward = injected(IptablesForwardPort.class);
forward.publicAddress = assignPublicAddress;
forward.ruleKey = protocol.name() + "-" + uuid;
forward.protocol = protocol;
forward.privateAddress = new OpsProvider<String>() {
@Override
public String get() throws OpsException {
// Refresh item to pick up new tags
backendItem = platformLayerClient.getItem(backendItem.getKey(), DirectInstance.class);
PlatformLayerCloudMachine instanceMachine = (PlatformLayerCloudMachine) instanceHelpers.getMachine(backendItem);
DirectInstance instance = (DirectInstance) instanceMachine.getInstance();
List<InetAddress> addresses = Tag.NETWORK_ADDRESS.find(instance);
InetAddress address = InetAddressChooser.preferIpv4().choose(addresses);
if (address == null) {
throw new IllegalStateException();
}
if (InetAddressUtils.isIpv6(address)) {
// We can't NAT IPV4 -> IPV6 (I think)
throw new IllegalStateException();
}
return address.getHostAddress();
}
};
forward.privatePort = backendPort;
cloudHost.addChild(forward);
}
}
{
OpsProvider<TagChanges> tagChanges = new OpsProvider<TagChanges>() {
@Override
public TagChanges get() {
TagChanges tagChanges = new TagChanges();
InetSocketAddress socketAddress = assignPublicAddress.get();
if (socketAddress == null) {
return null;
}
if (socketAddress.getPort() != publicPort) {
throw new IllegalStateException();
}
EndpointInfo endpoint = new EndpointInfo(socketAddress);
tagChanges.addTags.add(endpoint.toTag());
return tagChanges;
}
};
for (ItemBase tagItem : tagItems) {
Tagger tagger = addChild(Tagger.class);
tagger.platformLayerKey = tagItem.getKey();
tagger.tagChangesProvider = tagChanges;
}
}
}
use of org.platformlayer.ops.OpsProvider in project platformlayer by platformlayer.
the class KvmInstance method addChildren.
@Override
protected void addChildren() throws OpsException {
CloudInstanceMapper instance;
{
instance = injected(CloudInstanceMapper.class);
instance.instance = OpsContext.get().getInstance(DirectInstance.class);
addChild(instance);
}
instance.addChild(ManagedDirectory.build(getInstanceDir(), "700"));
final NetworkAddressPoolAssignment address4;
{
address4 = instance.addChild(NetworkAddressPoolAssignment.class);
address4.holder = owner;
address4.poolProvider = DirectCloudUtils.getPrivateAddressPool4();
}
final NetworkAddressPoolAssignment address6;
{
address6 = instance.addChild(NetworkAddressPoolAssignment.class);
address6.holder = owner;
address6.poolProvider = directCloudHelpers.getAddressPool6();
}
{
NetworkTunDevice tun = injected(NetworkTunDevice.class);
tun.interfaceName = getEthernetDeviceName();
tun.bridgeName = new Provider<String>() {
@Override
public String get() {
DirectHost host = OpsContext.get().getInstance(DirectHost.class);
return host.bridge;
}
};
instance.addChild(tun);
}
final SocketAddressPoolAssignment assignMonitorPort;
{
assignMonitorPort = injected(SocketAddressPoolAssignment.class);
assignMonitorPort.holder = owner;
assignMonitorPort.poolProvider = DirectCloudUtils.getKvmMonitorPortPool();
instance.addChild(assignMonitorPort);
}
final SocketAddressPoolAssignment assignVncPort;
{
assignVncPort = injected(SocketAddressPoolAssignment.class);
assignVncPort.holder = owner;
assignVncPort.poolProvider = DirectCloudUtils.getVncPortPool();
instance.addChild(assignVncPort);
}
{
ConfigIso iso = injected(ConfigIso.class);
iso.isoFile = getConfigIsoPath();
iso.buildDir = new File(getInstanceDir(), "config_iso_src");
iso.model = new TemplateDataSource() {
@Override
public void buildTemplateModel(Map<String, Object> model) throws OpsException {
InterfaceModel eth0 = InterfaceModel.build("eth0");
AddressModel ipv4 = address4.get();
eth0.addAddress(ipv4);
AddressModel ipv6 = address6.get();
eth0.addAddress(ipv6);
List<InterfaceModel> interfaces = Lists.newArrayList();
interfaces.add(eth0);
model.put("interfaces", interfaces);
List<String> authorizedKeys = Lists.newArrayList();
authorizedKeys.add(OpenSshUtils.serialize(sshPublicKey));
model.put("authorizedKeys", authorizedKeys);
}
};
instance.addChild(iso);
}
{
DownloadImage download = injected(DownloadImage.class);
download.imageFile = getImagePath();
download.recipeKey = recipeId;
download.imageFormats = Arrays.asList(ImageFormat.DiskRaw, ImageFormat.DiskQcow2);
instance.addChild(download);
}
{
ManagedKvmInstance kvmInstance = addChild(ManagedKvmInstance.class);
kvmInstance.id = id;
kvmInstance.memoryMb = Math.max(256, minimumMemoryMB);
kvmInstance.vcpus = 1;
kvmInstance.base = getInstanceDir();
kvmInstance.monitor = assignMonitorPort;
kvmInstance.vnc = assignVncPort;
kvmInstance.nics = buildVnics();
kvmInstance.drives = buildDrives();
kvmInstance.addresses.add(address4);
kvmInstance.addresses.add(address6);
}
{
final DirectInstance model = OpsContext.get().getInstance(DirectInstance.class);
OpsProvider<TagChanges> tagChanges = new OpsProvider<TagChanges>() {
@Override
public TagChanges get() {
TagChanges tagChanges = new TagChanges();
tagChanges.addTags.add(Tag.INSTANCE_KEY.build(model.getKey()));
AddressModel ipv4 = address4.get();
AddressModel ipv6 = address6.get();
tagChanges.addTags.add(Tag.NETWORK_ADDRESS.build(ipv4));
tagChanges.addTags.add(Tag.NETWORK_ADDRESS.build(ipv6));
return tagChanges;
}
};
addChild(Tagger.build(model, tagChanges));
}
}
use of org.platformlayer.ops.OpsProvider in project platformlayer by platformlayer.
the class LxcInstanceController method addChildren.
@Override
protected void addChildren() throws OpsException {
final DirectInstance model = OpsContext.get().getInstance(DirectInstance.class);
CloudInstanceMapper instance;
{
instance = injected(CloudInstanceMapper.class);
instance.instance = OpsContext.get().getInstance(DirectInstance.class);
addChild(instance);
}
instance.addChild(ManagedDirectory.build(getInstanceDir(), "700"));
// TODO: If we're not going to assign an IPV4 redirect, we might not need this
final Provider<AddressModel> address4;
{
NetworkAddressPoolAssignment provider = instance.addChild(NetworkAddressPoolAssignment.class);
provider.holder = model.getKey();
provider.poolProvider = DirectCloudUtils.getPrivateAddressPool4();
address4 = provider;
}
final Provider<AddressModel> address6;
{
NetworkAddressPoolAssignment provider = instance.addChild(NetworkAddressPoolAssignment.class);
provider.holder = model.getKey();
provider.poolProvider = directCloudHelpers.getAddressPool6();
address6 = provider;
}
// {
// NetworkTunDevice tun = injected(NetworkTunDevice.class);
// tun.interfaceName = getEthernetDeviceName();
// tun.bridgeName = Providers.getProperty(assignNetworkAddress, "bridge");
// instance.addChild(tun);
// }
{
DownloadImage download = injected(DownloadImage.class);
download.imageFile = new File(getInstanceDir(), "rootfs");
download.recipeKey = model.recipeId;
download.imageFormats = Collections.singletonList(ImageFormat.Tar);
instance.addChild(download);
}
{
LxcBootstrap bootstrap = injected(LxcBootstrap.class);
bootstrap.address4 = address4;
bootstrap.address6 = address6;
bootstrap.lxcId = id;
bootstrap.instanceDir = instanceDir;
try {
bootstrap.sshPublicKey = OpenSshUtils.readSshPublicKey(model.sshPublicKey);
} catch (IOException e) {
throw new OpsException("Error deserializing SSH key", e);
}
bootstrap.hostname = model.hostname;
instance.addChild(bootstrap);
}
InstanceScript script;
{
script = instance.addChild(InstanceScript.class);
script.filePath = new File(DirectHostController.LXC_INSTANCE_DIR, id);
String key = "lxc-" + id;
script.key = key;
script.addresses.add(address4);
script.addresses.add(address6);
// script.hostPrimaryInterface = hostModel.publicInterface;
Command command = Command.build("lxc-start");
command.addLiteral("--name").addQuoted(id);
script.launchInstanceCommand = command;
}
{
// ManagedSupervisordInstance service = instance.addChild(ManagedSupervisordInstance.class);
StandardService service = instance.addChild(StandardService.class);
script.configure(model, service);
}
{
OpsProvider<TagChanges> tagChanges = new OpsProvider<TagChanges>() {
@Override
public TagChanges get() {
TagChanges tagChanges = new TagChanges();
tagChanges.addTags.add(Tag.INSTANCE_KEY.build(model.getKey()));
AddressModel ipv4 = address4.get();
AddressModel ipv6 = address6.get();
if (ipv4 != null) {
tagChanges.addTags.add(Tag.NETWORK_ADDRESS.build(ipv4));
}
if (ipv6 != null) {
tagChanges.addTags.add(Tag.NETWORK_ADDRESS.build(ipv6));
}
return tagChanges;
}
};
instance.addChild(Tagger.build(model, tagChanges));
}
}
use of org.platformlayer.ops.OpsProvider in project platformlayer by platformlayer.
the class SimpleApp method addChildren.
@Override
protected void addChildren() throws OpsException {
DownloadFileByHash download = addChild(buildDownload());
File deployed = new File(jettyTemplate.getWarsDeployDir(), getWarName());
addChild(ManagedSymlink.build(deployed, download.filePath));
addChild(ManagedDirectory.build(getWorkDir(), "0700"));
{
PropertiesConfigFile conf = addChild(PropertiesConfigFile.class);
conf.filePath = getConfigurationFilePath();
conf.propertiesSupplier = new OpsProvider<Map<String, String>>() {
@Override
public Map<String, String> get() throws OpsException {
return getConfigurationProperties();
}
};
}
File contextDir = jettyTemplate.getContextDir();
ContextTemplate contextTemplate = new ContextTemplate();
addChild(TemplatedFile.build(contextTemplate, new File(contextDir, "context.xml")));
}
Aggregations