/** * 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.command.InspectContainerResponse; import com.github.dockerjava.api.model.Event; import com.github.dockerjava.core.command.EventsResultCallback; import com.google.common.base.Objects; import java.util.ArrayList; import java.util.Iterator; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CommandStack; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.emf.transaction.RollbackException; import org.eclipse.emf.transaction.TransactionalCommandStack; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.xtext.xbase.lib.Exceptions; import org.occiware.clouddesigner.occi.Configuration; import org.occiware.clouddesigner.occi.Link; import org.occiware.clouddesigner.occi.Resource; import org.occiware.clouddesigner.occi.docker.Container; import org.occiware.clouddesigner.occi.docker.Contains; import org.occiware.clouddesigner.occi.docker.Machine; import org.occiware.clouddesigner.occi.docker.connector.ExecutableContainer; import org.occiware.clouddesigner.occi.docker.connector.ModelHandler; import org.occiware.clouddesigner.occi.docker.connector.dockermachine.manager.DockerObserver; import org.occiware.clouddesigner.occi.infrastructure.ComputeStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class notifies a new events to the connector. */ @SuppressWarnings("all") public class EventCallBack extends EventsResultCallback { private static Logger LOGGER = LoggerFactory.getLogger(EventCallBack.class); private ExecutableContainer container; public EventCallBack(final ExecutableContainer container) { this.container = container; } public void modifyResourceSet(final Resource resource, final String state, final String containerId) { try { org.eclipse.emf.ecore.resource.Resource _eResource = resource.eResource(); ResourceSet _resourceSet = _eResource.getResourceSet(); TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(_resourceSet); Command cmd = new RecordingCommand(domain) { @Override protected void doExecute() { boolean _equalsIgnoreCase = state.equalsIgnoreCase("stop"); if (_equalsIgnoreCase) { ((ExecutableContainer) resource).setState(ComputeStatus.INACTIVE); } boolean _equalsIgnoreCase_1 = state.equalsIgnoreCase("start"); if (_equalsIgnoreCase_1) { ((ExecutableContainer) resource).setState(ComputeStatus.ACTIVE); } boolean _equalsIgnoreCase_2 = state.equalsIgnoreCase("create"); if (_equalsIgnoreCase_2) { final ModelHandler instanceMH = new ModelHandler(); Machine machine = ((ExecutableContainer) resource).getCurrentMachine(); Container c = instanceMH.buildContainer(machine, containerId); final DockerObserver observer = new DockerObserver(); observer.listener(c, machine); instanceMH.linkContainerToMachine(c, machine); EObject _eContainer = machine.eContainer(); if ((_eContainer instanceof Configuration)) { EObject _eContainer_1 = machine.eContainer(); EList<Resource> _resources = ((Configuration) _eContainer_1).getResources(); _resources.add(((ExecutableContainer) c)); EventCallBack.LOGGER.info("Load new container"); } } boolean _equalsIgnoreCase_3 = state.equalsIgnoreCase("destroy"); if (_equalsIgnoreCase_3) { final ModelHandler instanceMH_1 = new ModelHandler(); Container container = ((Container) resource); Machine machine_1 = ((ExecutableContainer) resource).getCurrentMachine(); instanceMH_1.removeContainerFromMachine(container, machine_1); EObject _eContainer_2 = machine_1.eContainer(); if ((_eContainer_2 instanceof Configuration)) { EObject _eContainer_3 = machine_1.eContainer(); EList<Resource> _resources_1 = ((Configuration) _eContainer_3).getResources(); _resources_1.remove(((ExecutableContainer) container)); EventCallBack.LOGGER.info("Destroy a container"); } } } }; try { CommandStack _commandStack = domain.getCommandStack(); ((TransactionalCommandStack) _commandStack).execute(cmd, null); } catch (final Throwable _t) { if (_t instanceof RollbackException) { final RollbackException rbe = (RollbackException)_t; IStatus _status = rbe.getStatus(); String _string = _status.toString(); EventCallBack.LOGGER.error(_string); } else { throw Exceptions.sneakyThrow(_t); } } } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Override public void onNext(final Event event) { EventCallBack.LOGGER.info("Received event #{}", event); Machine machine = this.container.getCurrentMachine(); ComputeStatus _state = machine.getState(); boolean _equals = Objects.equal(_state, ComputeStatus.ACTIVE); if (_equals) { EList<Link> links = machine.getLinks(); int _size = links.size(); EventCallBack.LOGGER.info("Link size #{}", Integer.valueOf(_size)); try { for (final Link l : links) { { Contains contains = ((Contains) l); boolean _notEquals = (!Objects.equal(contains, null)); if (_notEquals) { Resource _target = contains.getTarget(); if ((_target instanceof Container)) { Resource _target_1 = contains.getTarget(); String _containerid = ((ExecutableContainer) _target_1).getContainerid(); String _id = event.getId(); boolean _equals_1 = Objects.equal(_containerid, _id); if (_equals_1) { String _status = event.getStatus(); boolean _equalsIgnoreCase = _status.equalsIgnoreCase("stop"); if (_equalsIgnoreCase) { Resource _target_2 = contains.getTarget(); String _status_1 = event.getStatus(); String _id_1 = event.getId(); this.modifyResourceSet(_target_2, _status_1, _id_1); EventCallBack.LOGGER.info("Apply stop notification to model"); } String _status_2 = event.getStatus(); boolean _equalsIgnoreCase_1 = _status_2.equalsIgnoreCase("start"); if (_equalsIgnoreCase_1) { Resource _target_3 = contains.getTarget(); String _status_3 = event.getStatus(); String _id_2 = event.getId(); this.modifyResourceSet(_target_3, _status_3, _id_2); EventCallBack.LOGGER.info("Apply start notification to model"); } String _status_4 = event.getStatus(); boolean _equalsIgnoreCase_2 = _status_4.equalsIgnoreCase("destroy"); if (_equalsIgnoreCase_2) { Resource _target_4 = contains.getTarget(); String _status_5 = event.getStatus(); String _id_3 = event.getId(); this.modifyResourceSet(_target_4, _status_5, _id_3); EventCallBack.LOGGER.info("Apply destroy notification to model"); } } else { if ((event.getStatus().equalsIgnoreCase("create") && (!this.containerIsInsideMachine(machine, event.getId())))) { Resource _target_5 = contains.getTarget(); String _status_6 = event.getStatus(); String _id_4 = event.getId(); this.modifyResourceSet(_target_5, _status_6, _id_4); EventCallBack.LOGGER.info("Apply create notification to model"); } } } } } } } catch (final Throwable _t) { if (_t instanceof Exception) { final Exception e = (Exception)_t; } else { throw Exceptions.sneakyThrow(_t); } } } } public ArrayList<ExecutableContainer> listContainers(final Machine machine) { ArrayList<ExecutableContainer> containers = new ArrayList<ExecutableContainer>(); EList<Link> _links = machine.getLinks(); for (final Link l : _links) { { Contains contains = ((Contains) l); Resource _target = contains.getTarget(); if ((_target instanceof Container)) { Resource _target_1 = contains.getTarget(); containers.add(((ExecutableContainer) _target_1)); } } } return containers; } public boolean containerIsInsideMachine(final Machine machine, final String containerId) { final InspectContainerResponse container = ExecutableContainer.dockerContainerManager.inspectContainer(machine, containerId); String _name = container.getName(); final String name = _name.replaceAll("/", ""); ArrayList<ExecutableContainer> listContainer = this.listContainers(machine); for (final ExecutableContainer ec : listContainer) { String _name_1 = ec.getName(); boolean _equalsIgnoreCase = _name_1.equalsIgnoreCase(name); if (_equalsIgnoreCase) { return true; } } return false; } public Resource getResourceById(final Machine machine, final String containerId) { EList<Link> links = machine.getLinks(); Iterator<Link> iterat = links.iterator(); while (iterat.hasNext()) { { Link contains = iterat.next(); boolean _notEquals = (!Objects.equal(contains, null)); if (_notEquals) { Resource _target = contains.getTarget(); if ((_target instanceof Container)) { Resource _target_1 = contains.getTarget(); String _containerid = ((ExecutableContainer) _target_1).getContainerid(); boolean _equals = Objects.equal(_containerid, containerId); if (_equals) { return contains.getTarget(); } } } } } return null; } }