/**
* Copyright (c) 2015 INRIA.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* - Fawaz PARAISO
* - Philippe MERLE
*/
package org.occiware.clouddesigner.occi.docker.connector;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.google.common.base.Objects;
import com.google.common.collect.Multimap;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.occiware.clouddesigner.occi.Resource;
import org.occiware.clouddesigner.occi.docker.Contains;
import org.occiware.clouddesigner.occi.docker.DockerFactory;
import org.occiware.clouddesigner.occi.docker.DockerPackage;
import org.occiware.clouddesigner.occi.docker.Link;
import org.occiware.clouddesigner.occi.docker.Machine;
import org.occiware.clouddesigner.occi.docker.connector.ComputeStateMachine;
import org.occiware.clouddesigner.occi.docker.connector.EventCallBack;
import org.occiware.clouddesigner.occi.docker.connector.dockerjava.DockerContainerManager;
import org.occiware.clouddesigner.occi.docker.connector.dockermachine.manager.DockerObserver;
import org.occiware.clouddesigner.occi.docker.impl.ContainerImpl;
import org.occiware.clouddesigner.occi.infrastructure.ComputeStatus;
import org.occiware.clouddesigner.occi.infrastructure.RestartMethod;
import org.occiware.clouddesigner.occi.infrastructure.StopMethod;
import org.occiware.clouddesigner.occi.infrastructure.SuspendMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class implements an executable Docker container.
*/
@SuppressWarnings("all")
public class ExecutableContainer extends ContainerImpl {
private static Logger LOGGER = LoggerFactory.getLogger(ExecutableContainer.class);
private Map<DockerClient, CreateContainerResponse> map = null;
protected static DockerContainerManager dockerContainerManager = null;
protected static Map<String, Machine> listCurrentMachine = new HashMap<String, Machine>();
private EventCallBack eventCallback = new EventCallBack(this);
/**
* Docker containers have a state machine.
*/
private final ComputeStateMachine<org.occiware.clouddesigner.occi.docker.Container> stateMachine = new ComputeStateMachine<org.occiware.clouddesigner.occi.docker.Container>(this) {
/**
* Start the Docker container.
*/
@Override
public void start_execute() {
ExecutableContainer.LOGGER.info("EXECUTE container start");
final Machine machine = ExecutableContainer.this.getCurrentMachine();
ComputeStatus _state = machine.getState();
String _string = _state.toString();
boolean _equalsIgnoreCase = _string.equalsIgnoreCase("active");
if (_equalsIgnoreCase) {
try {
boolean _equals = Objects.equal(ExecutableContainer.dockerContainerManager, null);
if (_equals) {
DockerContainerManager _dockerContainerManager = new DockerContainerManager(machine, ExecutableContainer.this.eventCallback);
ExecutableContainer.dockerContainerManager = _dockerContainerManager;
}
ExecutableContainer.dockerContainerManager.startContainer(machine, this.compute);
} catch (final Throwable _t) {
if (_t instanceof Exception) {
final Exception e = (Exception)_t;
ExecutableContainer.this.createContainer(machine);
ExecutableContainer.dockerContainerManager.startContainer(machine, this.compute);
} else {
throw Exceptions.sneakyThrow(_t);
}
}
}
}
/**
* Stop the Docker container.
*/
@Override
public void stop_execute(final StopMethod method) {
ExecutableContainer.LOGGER.info("EXECUTE container stop");
final Machine machine = ExecutableContainer.this.getCurrentMachine();
ComputeStatus _state = machine.getState();
String _string = _state.toString();
boolean _equalsIgnoreCase = _string.equalsIgnoreCase("active");
if (_equalsIgnoreCase) {
ComputeStatus _state_1 = this.compute.getState();
String _string_1 = _state_1.toString();
boolean _equalsIgnoreCase_1 = _string_1.equalsIgnoreCase("active");
if (_equalsIgnoreCase_1) {
try {
boolean _equals = Objects.equal(ExecutableContainer.dockerContainerManager, null);
if (_equals) {
DockerContainerManager _dockerContainerManager = new DockerContainerManager(machine, ExecutableContainer.this.eventCallback);
ExecutableContainer.dockerContainerManager = _dockerContainerManager;
}
String _name = this.compute.getName();
ExecutableContainer.dockerContainerManager.stopContainer(machine, _name);
} catch (final Throwable _t) {
if (_t instanceof Exception) {
final Exception e = (Exception)_t;
this.compute.setState(ComputeStatus.INACTIVE);
} else {
throw Exceptions.sneakyThrow(_t);
}
}
}
}
}
/**
* Restart the Docker container.
*/
@Override
public void restart_execute(final RestartMethod method) {
ExecutableContainer.LOGGER.info("EXECUTE container restart");
this.stop_execute(StopMethod.GRACEFUL);
this.start_execute();
}
/**
* Suspend the Docker container.
*/
@Override
public void suspend_execute(final SuspendMethod method) {
ExecutableContainer.LOGGER.info("EXECUTE container suspend");
}
};
@Override
public void start() {
this.stateMachine.start();
final DockerObserver observer = new DockerObserver();
final Machine machine = this.getCurrentMachine();
observer.listener(this, machine);
}
@Override
public void stop(final StopMethod method) {
this.stateMachine.stop(method);
}
@Override
public void restart(final RestartMethod method) {
this.stateMachine.restart(method);
}
@Override
public void suspend(final SuspendMethod method) {
this.stateMachine.suspend(method);
}
public Map<DockerClient, CreateContainerResponse> createContainer(final Machine machine, final Multimap<String, String> containerDependency) {
Map<DockerClient, CreateContainerResponse> result = new HashMap<DockerClient, CreateContainerResponse>();
boolean _equals = Objects.equal(ExecutableContainer.dockerContainerManager, null);
if (_equals) {
DockerContainerManager _dockerContainerManager = new DockerContainerManager(machine, this.eventCallback);
ExecutableContainer.dockerContainerManager = _dockerContainerManager;
}
ExecutableContainer.dockerContainerManager.pullImage(machine, this.image);
Map<DockerClient, CreateContainerResponse> _createContainer = ExecutableContainer.dockerContainerManager.createContainer(machine, this, containerDependency);
result = _createContainer;
HashMap<DockerClient, CreateContainerResponse> _hashMap = new HashMap<DockerClient, CreateContainerResponse>(result);
this.map = _hashMap;
return result;
}
public void createContainer(final Machine machine) {
boolean _equals = Objects.equal(ExecutableContainer.dockerContainerManager, null);
if (_equals) {
DockerContainerManager _dockerContainerManager = new DockerContainerManager(machine, this.eventCallback);
ExecutableContainer.dockerContainerManager = _dockerContainerManager;
}
ExecutableContainer.dockerContainerManager.pullImage(machine, this.image);
ExecutableContainer.dockerContainerManager.createContainer(machine, this);
}
public void removeContainer(final Machine machine) {
boolean _equals = Objects.equal(ExecutableContainer.dockerContainerManager, null);
if (_equals) {
DockerContainerManager _dockerContainerManager = new DockerContainerManager(machine, this.eventCallback);
ExecutableContainer.dockerContainerManager = _dockerContainerManager;
}
String _name = machine.getName();
ExecutableContainer.dockerContainerManager.removeContainer(_name, this.name);
}
public org.occiware.clouddesigner.occi.docker.Container linkContainerToContainer(final org.occiware.clouddesigner.occi.docker.Container container) {
DockerFactory _dockerFactory = DockerPackage.eINSTANCE.getDockerFactory();
Link links = _dockerFactory.createLink();
links.setTarget(container);
this.links.add(links);
return container;
}
public Machine linkContainerToMachine(final Machine machine) {
DockerFactory _dockerFactory = DockerPackage.eINSTANCE.getDockerFactory();
Contains contains = _dockerFactory.createContains();
contains.setTarget(this);
EList<org.occiware.clouddesigner.occi.Link> _links = machine.getLinks();
_links.add(contains);
return machine;
}
public Machine getCurrentMachine() {
boolean _containsKey = ExecutableContainer.listCurrentMachine.containsKey(this.id);
if (_containsKey) {
return ExecutableContainer.listCurrentMachine.get(this.id);
}
EList<EObject> _eContents = this.eContainer.eContents();
for (final EObject eo : _eContents) {
if ((eo instanceof Machine)) {
final Machine machine = ((Machine) eo);
EList<org.occiware.clouddesigner.occi.Link> _links = machine.getLinks();
for (final org.occiware.clouddesigner.occi.Link l : _links) {
if ((l instanceof Contains)) {
final Contains contains = ((Contains) l);
Resource _target = contains.getTarget();
if ((_target instanceof org.occiware.clouddesigner.occi.docker.Container)) {
Resource _target_1 = ((Contains)l).getTarget();
boolean _equals = Objects.equal(((ExecutableContainer) _target_1).id, this.id);
if (_equals) {
ExecutableContainer.listCurrentMachine.put(this.id, machine);
return machine;
}
}
}
}
}
}
return null;
}
}