<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Using Adaptation Plans to Control the Behavior of Models@runtime</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Maksym Lushpenko</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Nicolas Ferry</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Hui Song</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Franck Chauvel</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Arnor Solberg</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Networked Systems and Services, SINTEF</institution>
          ,
          <addr-line>Oslo</addr-line>
          ,
          <country country="NO">Norway</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>The models@runtime pattern proposes to leverage models as executable artefacts. A runtime model describing the state of the system is causally connected to the running system. Models@runtime engines typically play an active role in the definition of the adaptation plan that specifies the set of concrete tasks describing how the system should be adapted to reflect the change made on the runtime model. However, the generation of such plans generally relies on a set of predefined rules and the resulting plan is thus arbitrarily derived. In this paper we present an evolution of the models@runtime pattern with: (i) a DSL for the specification of adaptation plans and (ii) a runtime environment to enact such adaptation plans. The proposed approach has been applied to the Cloud Modelling Framework (CLOUDMF).</p>
      </abstract>
      <kwd-group>
        <kwd>models@run</kwd>
        <kwd>time</kwd>
        <kwd>dynamic adaptation</kwd>
        <kwd>adaptation plan</kwd>
        <kwd>cloud computing</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 Introduction</title>
      <p>Models@runtime [1,2] is an architectural pattern for dynamically adaptive systems that
leverages models as executable artefacts supporting the execution and adaptation of a
system. This pattern proposes to decouple the internal state of the system from the
management API used to modify it. A model describing the state of the system, hereafter
called runtime model, is causally connected to the running system by exploiting its
management API. Hence, any change in the running system is automatically reflected into
the model, and, conversely, any change made to the model is enacted, on demand, onto
the running system. This decoupling facilitates simulation, planning and automation of
adaptation activities.</p>
      <p>As part of the causal connection, the engine that synchronizes the runtime model
with the running system automatically realizes the high-level adaptations made on the
model into the running system. Yet, there are often alternative ways to enact these
adaptations onto the system, which may significantly affect the effectiveness as well as
the performance and the quality of service of the running system. Existing
synchronization engines in projects such as DiVA [3], Kevoree [4], CLOUDMF [5], Genie [6] all
implicitly define an adaptation plan that specifies the set of concrete actions describing
how the system should be adapted to reflect the change made on the runtime model.</p>
      <sec id="sec-1-1">
        <title>This plan is arbitrarily derived from the difference between the desired and the current state of the system, and therefore overlooks more relevant options. In complex systems, where guarantees in the quality of services are major concerns, the synchronization must allow for customization of the adaptation plan.</title>
      </sec>
      <sec id="sec-1-2">
        <title>In this paper, we present our approach to support the dynamic modification of adapt</title>
        <p>ation plans. We propose: (i) a domain specific modelling language for the specification
of adaptation plans and, (ii) a runtime environment to support the enactment of such
adaptation plans. The proposed approach has been implemented and applied to the Cloud</p>
      </sec>
      <sec id="sec-1-3">
        <title>Modelling Framework (CLOUDMF) [7,5].</title>
      </sec>
      <sec id="sec-1-4">
        <title>The remainder of the paper is organized as follow. Section 2 presents a motivat</title>
        <p>ing example that will be used throughout the paper. Section 3 introduces the overall
approach. Section 4 presents the modelling language before Section 5 describes the
supporting runtime environment. Finally Section 7 compares the proposed approach
with the state-of-the-art and Section 8 draws some conclusions.
2</p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>Motivating Example</title>
      <sec id="sec-2-1">
        <title>CLOUDMF supports developers and operators in managing multi-clouds systems that run accross several clouds and exploit both IaaS and PaaS solutions. CLOUDMF implements the models@runtime pattern and thus maintains a runtime model synchronized with the running system.</title>
        <p>Such runtime model is described using a domain-specific modelling language (DSML)
and includes the cloud environment (e.g., virtual machines, applications servers or
thirdparty services) as well as the software components of interest (e.g., services,
applications or libraries). This DSML, called the Cloud Modelling Language (CLOUDML),
is inspired by component-based approaches [8]. In this respect, cloud deployment can
be regarded as assemblies of components exposing ports, and bindings between these
ports. Their life-cycle reflects typical operation activities such as uploads, installations,
configurations, start or stop. Additional resources such as scripts, binaries or
configuration files can complement the components and explicit the behaviour of each operation
activities.</p>
        <p>
          (
          <xref ref-type="bibr" rid="ref1">1</xref>
          )
Current 
model
        </p>
        <sec id="sec-2-1-1">
          <title>Reasoning engine(s)</title>
          <p>
            (
            <xref ref-type="bibr" rid="ref2">2</xref>
            )
Target 
model
(
            <xref ref-type="bibr" rid="ref3">3</xref>
            )
Diff
(
            <xref ref-type="bibr" rid="ref4">4</xref>
            )
          </p>
        </sec>
        <sec id="sec-2-1-2">
          <title>Running system</title>
          <p>
            Adaptation
engine
(
            <xref ref-type="bibr" rid="ref5">5</xref>
            )
          </p>
        </sec>
      </sec>
      <sec id="sec-2-2">
        <title>In a manual deployment of Storm, an operator first configures the Nimbus and the</title>
        <p>Supervisors before she connects them. Indeed, their configuration yields files that are
then filled in with specific data during their connection. By contrast, in a deployment
automated with CLOUDMF, the default ordering of actions is the opposite: the
connection preceeds the configuration. Even if workarounds are possible (e.g., attach
configuration script to the install command), they introduce two issues: (i) developers must
know in advance the exact order in which all commands from all components are going
to be executed by the CLOUDMF deployment engine, (ii) it can hinder the proper reuse
of the component because of the misuse of install/configure commands.
1 https://storm.apache.org/
2 https://zookeeper.apache.org/</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Overall Approach</title>
      <p>In order to address these issues, we apply the approach depicted in Figure 3. First, the
engine derives a tentative adaptation plan from a target model describing the desired
system state. The user or a reasoning engine can then adjust it. Applied to our
motivating example, once a deployment plan is generated from the defined Storm CLOUDML
model, the user can then analyze and change it to trigger the configure commands before
the connect commands. This consolidated adaptation plan is then fed in the adaptation
engine, which is responsible for its execution.</p>
      <sec id="sec-3-1">
        <title>When the runtime model is already synchronized with the running system, the engine first compares the actual and the desired system states and then derives a tentative adaptation plan, which can be modified before being enacted.</title>
        <p>Create/update
runtime model
Declarative definition
of the desired system's state
Execute adaptation plan
Generate adaptation plan 
from the runtime model
Reconfigure adaptation
plan if needed
Definition of the
adaptation's behavior</p>
      </sec>
      <sec id="sec-3-2">
        <title>We model adaptation plans as workflows. Although existing "models@runtime" plat</title>
        <p>forms usually derive adaptation plans as a sequence of adaptation actions, these actions
may often be executed in parallel. For instance, in CLOUDMF, adaptation actions have
to be parallelized as the associated running system is inherently distributed and
deployment actions are often time consuming.</p>
      </sec>
      <sec id="sec-3-3">
        <title>Our language to model adaptation plans is evolved from a subset of the concepts</title>
        <p>of UML activity diagrams. Figure 4 depicts the adaptation plan specifying the
deployment of a simple Apache Storm cluster using our language. This workflow reflects the
synchronization needed to properly provision, deploy and configure the whole Storm
cluster. It starts by provisioning the cloud resources needed for the storm and the
Zoo</p>
      </sec>
      <sec id="sec-3-4">
        <title>Keeper clusters. Once the ZooKeeper cluster is installed and started, the installation of the Nimbus and its Supervisor is initiated and the workflow proceeds with connecting all these pieces.</title>
        <p>Storm deployment plan</p>
        <p>VM IP 
addresses
Credentials</p>
        <p>Provision
Zookeeper
Provision
Nimbus
Provision
supervisor</p>
        <p>Install &amp; 
start 
Zookeeper
Install
Nimbus
Install
supervisor</p>
        <p>Configure
&amp; start 
Nimbus
Connect to 
zookeeper
Connect to 
Nimbus</p>
        <p>Start 
supervisor
ActivityInitialNode Data flow</p>
        <p>Control flow Action ObjectNode Fork</p>
        <p>Join</p>
        <p>ActivityFinalNode</p>
        <p>Figure 5 shows the metamodel of our language. An adaptation plan consists is an
Activity made of ActivityNodes, and ActivityEdges. An ActivityNode can be
an Action to be performed on the running system. For instance, in the context of</p>
      </sec>
      <sec id="sec-3-5">
        <title>CLOUDML, it represents deployment actions such as the provisioning of a virtual ma</title>
        <p>chine (VM). An ObjectNode is another type of ActivityNode which can be used to
store data that can later be exploited by Actions (e.g., the IP address of the provisioned
VM). Finally, an ActivityNode can be a ControlNode, which can be specialized into
an ActivityInitial or ActivityFinal node describing the beginning and end of
an adaptation plan or into a join or fork node to parallelize and synchronize the
execution of independent Actions. An ExpansionRegion can be used to specify that a set
of tasks has to be executed several times in parallel or sequentially. ActivityNodes are
linked through ActivityEdges. The attribute objectFlow is used to specify that the
edge represents either the control flow orchestrating the execution of ActivityNodes
or the data flow to exchange objects between tasks.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Runtime environment</title>
      <p>This language is exploited by the runtime environment to specify and manipulate
adaptation plans. In order to implement the approach presented in Section 3 we evolved the
classical models@runtime architecture as depicted by the grey boxes in Figure 6. Once
a target model has been provided as input (step 3) to the models@runtime environment,
it can be compared to the runtime model if there is one. By contrast with the classical
approach, the target model or the result of this comparison is then fed to an adaptation
plan generator (step 4), which produces an initial adaptation plan (step 5). This plan
is exposed by the models@runtime environment and can be modified by third parties.</p>
      <sec id="sec-4-1">
        <title>Once the appropriate plan identified, the latter can be validated (step 6) before being</title>
        <p>executed (step 7). The Mexecution enginercuan then trigeger a set of atomic actions (step 8)
odels@ ntim
to be enacted onto the running system (step 9).</p>
        <p>
          (
          <xref ref-type="bibr" rid="ref1">1</xref>
          )
Current 
model
        </p>
        <p>
          (
          <xref ref-type="bibr" rid="ref2">2</xref>
          )
Target 
model
(
          <xref ref-type="bibr" rid="ref3">3</xref>
          )
        </p>
        <p>Diff</p>
        <p>
          (
          <xref ref-type="bibr" rid="ref4">4</xref>
          )
Reasoning engine(s)
        </p>
        <p>Adaptation</p>
        <p>plan
generator
Adaptation
action 
executor</p>
        <p>
          (
          <xref ref-type="bibr" rid="ref9">9</xref>
          )
Running system
(
          <xref ref-type="bibr" rid="ref5">5</xref>
          )
        </p>
        <p>Adaptation
plan</p>
        <p>
          (
          <xref ref-type="bibr" rid="ref6">6</xref>
          )
(
          <xref ref-type="bibr" rid="ref8">8</xref>
          )
        </p>
        <p>
          Plan 
validator
(
          <xref ref-type="bibr" rid="ref7">7</xref>
          )
        </p>
        <p>Plan 
execution 
engine
s15</p>
      </sec>
      <sec id="sec-4-2">
        <title>The engines to generate adaptation plans are typically specific to the domain of the</title>
        <p>models@runtime engine. In the context of our motivating example we created a
transformation generating an adaptation plan from a CLOUDML model or from the
comparison of two CLOUDML models. The plans are generated using the language presented
in Section 4.</p>
      </sec>
      <sec id="sec-4-3">
        <title>This transformation consists of the following four rules that are executed sequen</title>
        <p>tially. During the execution of each rule, a set of ActivityNodes and ActivityEdges
is created, together with the data required for the execution of Actions.</p>
      </sec>
      <sec id="sec-4-4">
        <title>Provision cloud resources This rule creates in the adaptation plan the actions respons</title>
        <p>ible for the parallel provisioning of virtual machines or cloud services on a given
cloud provider. A Fork node is created to enable parallel provisioning.</p>
      </sec>
      <sec id="sec-4-5">
        <title>Install components For every software component, this rule creates an action for each</title>
        <p>of the upload, download and install commands associated to the life-cycle
management of the component. In addition, if a component depends on another, it ensures
that the related actions are created in the proper order (i.e., required components
are installed first).</p>
      </sec>
      <sec id="sec-4-6">
        <title>Connect components This rule creates an action for each commands specified in the</title>
        <p>resources attached to the relationships. Moreover, it creates a Join node to
synchronize install actions of the components involved in the relationship.</p>
      </sec>
      <sec id="sec-4-7">
        <title>Start components This rule creates actions in the adaptation plan for the configure and</title>
        <p>start commands of every component.</p>
      </sec>
      <sec id="sec-4-8">
        <title>The way adaptation plans are generated is specific to the domain of the models@runtime engine. However, the language and its runtime environment are generic and can be applied to different domains. In the next section we present our execution environment.</title>
        <p>5.2</p>
        <p>Execution engine</p>
      </sec>
      <sec id="sec-4-9">
        <title>Once an adaptation plan has been generated and validated, the adaptation engine visits</title>
        <p>the plan in the proper order (taking into account parallelization and synchronization
points) and executes every Action.</p>
        <p>This engine relies on two libraries: the Java Reflection API3 and the Java Fork/Join
framework4. The first one is used to ensure the independence of both the language
and the execution engine from the domain on which the models@runtime engine is
applied. Each action within an adaptation plan refers to a method that will enact the
adaptation, the execution engine thus exploits the reflection mechanism to trigger the
call to the specified method. The second library offers support for the parallelization and
synchronization of the adaptation actions. In particular, it provides support for starting
multiple threads asynchronously and for joining them afterwards.</p>
      </sec>
      <sec id="sec-4-10">
        <title>Thanks to this mechanism, the engine executes each parallel branch of the adapt</title>
        <p>ation plan concurrently meaning that there are no time dependencies between tasks in
different parallel branches. The adaptation engine creates a number of threads whenever
it enters a Fork node (explicit fork) or an Action node with multiple outgoing edges
(implicit fork), and joins these multiple threads whenever it reaches a Join node
(explicit join) or an Action node with multiple incoming edges (implicit join).</p>
        <p>While the adaptation plan is being visited, the execution engine tracks the status of
each adaptation action and reflects this status in the adaptation plan. Each node and edge
in the adaptation plan may be in one of three states: Inactive, Active and Done (i.e.,
before the execution of the node/edge, during, and after the execution respectively). As
a result, the adaptation plan becomes a runtime model of the adaptation process that
co-evolves with the runtime model of the running system.
3 https://docs.oracle.com/javase/tutorial/reflect/
4 https://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.</p>
        <p>html</p>
      </sec>
      <sec id="sec-4-11">
        <title>Our language is implemented as plain Java objects, and also exists as an internal DSL</title>
        <p>within the CLOUDMF API. As for our Storm example, a whole deployment plan is
represented as an Activity (see Listing 1.1).</p>
      </sec>
      <sec id="sec-4-12">
        <title>Listing 1.1. Creating a deployment plan</title>
        <p>1 Activity deploymentPlan = ActivityBuilder . getActivity () ;</p>
        <p>The minimal set of nodes required for an executable plan consists of one StartNode,
one or several ActionNodes and one StopNode (see Listing 1.2). The first task that has
to be performed during a deployment is the provisioning of the virtual machines. For
each VM to provision, an action is created in the plan. Two parameters have to be
defined when creating an action: (i) the name of the method that will be used to enact
the action (e.g., reflection will be used to call the "provision" method that exploits the
cloud provider API to actually provision the VM); and (ii) the necessary information to
perform the call.</p>
      </sec>
      <sec id="sec-4-13">
        <title>Listing 1.2. Creating start, stop and action nodes</title>
        <p>1 ActivityInitialNode start = ActivityBuilder . controlStart () ;</p>
        <p>Action provision = ActivityBuilder . actionNode (" Provision ", VM );
3 ActivityFinalNode stop = ActivityBuilder . controlStop () ;</p>
        <p>Virtual machines can typically be provisioned in parallel, thus a ForkNode has to
be created and connected to the provisioning actions. Similar operation has to be
performed to synchronize the tasks after provisioning (see Listing 1.3). The Boolean
parameter used when creating these nodes indicates if the operators are applied to the control
or data flows. In this case, they are applied to the control flow.</p>
      </sec>
      <sec id="sec-4-14">
        <title>Listing 1.3. Creating synchronization actions</title>
        <p>1 Fork fork = ActivityBuilder . forkNode ( false );</p>
        <p>ActivityBuilder . connect ( fork , provision , true );
3 Join join = ActivityBuilder . joinNode ( false );
ActivityBuilder . connect ( provision , join , true );</p>
      </sec>
      <sec id="sec-4-15">
        <title>Finally, ObjectNodes can be created to store some data, such as the IPs of the pro</title>
        <p>visioned VMs (see Listing 1.4). An ObjectNode can be specialized into two types:
DatastoreNode, which does not allow to store duplicates or ParameterNode, which
can be used to supply some data to the deployment plan in the beginning of its
execution.</p>
      </sec>
      <sec id="sec-4-16">
        <title>Listing 1.4. Creating an object node</title>
        <p>ObjectNode IP = ActivityBuilder . objectNode (" IP ", Type );</p>
        <p>The results from this work are available as an open-source project5 implemented in
Java, using Maven as the build tool, and have been fully integrated with CLOUDMF6.</p>
      </sec>
      <sec id="sec-4-17">
        <title>The execution engine exploits the Java reflection and the join/fork frameworks. In addition, an engine has been created to automatically generate a DOT file from an adaptation plan together with a web page for their runtime graphical visualization.</title>
        <p>5 https://github.com/SINTEF-9012/cloudml/tree/Maksym
6 https://github.com/SINTEF-9012/cloudml/tree/master</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Related Work</title>
      <p>As explained before, projects such as DiVA [3], Kevoree [4], and Genie [6] that perform
architecture-based software adaptation relies on architectures similar to the one
presented in Section 2. From the difference between the runtime model and a target model,
a comparison engine identifies the list of adaptation actions to be performed in order
to reach the desired configuration. Similar approaches also exist at a lower level of
abstraction such as [9] which provides support for updating Java Software at runtime. By
contrast with our approach, these works do not include mechanism enabling the runtime
orchestration and adaption of the list of adaptation actions.</p>
      <p>The Sm@rt (Supporting Models@Runtime) framework [10] supports developers in
constructing a runtime component model on top of legacy systems. Developers define
a meta-model, which specifies the types of elements that compose the running system
as well as their relationships. Developers provide annotations on this meta-model to
specify the relation between the model operations (e.g., creating an element, reading
an attribute, or reset a connection) and the system’s management API. From the two
inputs, the Sm@rt generation framework automatically generates the synchronization
engine that maintains the causal connection between the model and the running system.</p>
      <sec id="sec-5-1">
        <title>This framework provides developers with the ability to tune the association between models modifications and system’s adaptation actions. However, these actions cannot be orchestrated at runtime.</title>
      </sec>
      <sec id="sec-5-2">
        <title>The EUREMA [11] framework supports the design and adaptation of self-adaptive</title>
        <p>systems that may involve multiple feedback loops. In particular, EURESMA allows
developers to model explicitly feedback loops by capturing their runtime models, their
usage, the flow of models operations as well as the relationships between these models.</p>
      </sec>
      <sec id="sec-5-3">
        <title>These models are kept alive at runtime and can be evolved. This approach does not offer explicit support for the definition of adaptation plans, however, the adaptation and monitoring transformations that causally connect the running system and the runtime model could be modeled as a feedback loops thus making our work complementary.</title>
        <p>8</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>Conclusion &amp; Future Work</title>
      <sec id="sec-6-1">
        <title>In this paper we presented an evolution of the classical models@runtime approach to</title>
        <p>support the dynamic management of the adaptation behavior of a models@runtime
environment. The proposed approach consists of: (i) a DSL for the specification of
adaptation plans (i.e., the plans describing the set of adaptation actions to be performed
in order to reach the desired application state); and (ii) a runtime environment to enact
such adaptation plans.</p>
        <p>Within our current implementation the engines to generate and validate adaptation
plans are specific to CLOUDMF. In future work we will consider generalizing and
applying our approach to other domains as well as extending it with an exception handling
mechanism possibly that could be combined with transaction and rollback support. In
particular, we plan to apply it to the software product line domain as a runtime engine
to build and adapt a product from a set of features. Longer term future work will consist
in building a similar framework for the monitoring mechanism embedded into typical
models@runtime engines. This would enable external entities to fully control the way
a runtime model is synchronized with the running system.</p>
      </sec>
      <sec id="sec-6-2">
        <title>Acknowledgement. The research leading to these results has received funding from</title>
        <p>the European Community’s Seventh Framework Programme (FP7/2007-2013) under
grant agreement number: 318484 (MODAClouds), 317715 (PaaSage).</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Morin</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barais</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jézéquel</surname>
            ,
            <given-names>J.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fleurey</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Solberg</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Models@Run.time to Support Dynamic Adaptation</article-title>
          .
          <source>IEEE Computer</source>
          <volume>42</volume>
          (
          <issue>10</issue>
          ) (
          <year>2009</year>
          )
          <fpage>44</fpage>
          -
          <lpage>51</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Blair</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bencomo</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          , France, R.:
          <source>Models@run.time. IEEE Computer</source>
          <volume>42</volume>
          (
          <issue>10</issue>
          ) (
          <year>2009</year>
          )
          <fpage>22</fpage>
          -
          <lpage>27</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Morin</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barais</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jezequel</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fleurey</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Solberg</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Models@ run. time to support dynamic adaptation</article-title>
          .
          <source>Computer</source>
          <volume>42</volume>
          (
          <issue>10</issue>
          ) (
          <year>2009</year>
          )
          <fpage>44</fpage>
          -
          <lpage>51</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Nain</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fouquet</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Morin</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barais</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jézéquel</surname>
            ,
            <given-names>J.M.</given-names>
          </string-name>
          , et al.:
          <article-title>Integrating iot and ios with a component-based approach</article-title>
          . In: EUROMICRO-SEAA. (
          <year>2010</year>
          )
          <fpage>191</fpage>
          -
          <lpage>198</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Ferry</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Song</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rossini</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chauvel</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Solberg</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Cloudmf: Applying mde to tame the complexity of managing multi-cloud applications</article-title>
          .
          <source>In: Utility and Cloud Computing (UCC)</source>
          ,
          <year>2014</year>
          IEEE/ACM 7th International Conference on,
          <source>IEEE</source>
          (
          <year>2014</year>
          )
          <fpage>269</fpage>
          -
          <lpage>277</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Bencomo</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Grace</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Flores</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hughes</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Blair</surname>
          </string-name>
          , G.:
          <article-title>Genie: Supporting the model driven development of reflective, component-based adaptive systems</article-title>
          . In: ICSE,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2008</year>
          )
          <fpage>811</fpage>
          -
          <lpage>814</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Ferry</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rossini</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chauvel</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Morin</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Solberg</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Towards model-driven provisioning, deployment, monitoring, and adaptation of multi-cloud systems</article-title>
          . In O'Conner, L., ed.
          <source>: Proceedings of CLOUD 2013: 6th IEEE International Conference on Cloud Computing, IEEE Computer Society</source>
          (
          <year>2013</year>
          )
          <fpage>887</fpage>
          -
          <lpage>894</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Szyperski</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Component Software: Beyond Object-Oriented Programming (2nd edition)</article-title>
          . Addison-Wesley
          <string-name>
            <surname>Professional</surname>
          </string-name>
          (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Cazzola</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rossini</surname>
            ,
            <given-names>N.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Al-Refai</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          , France, R.B.:
          <article-title>Fine-grained software evolution using uml activity and class models</article-title>
          .
          <source>In: Model-Driven Engineering Languages and Systems</source>
          . Springer (
          <year>2013</year>
          )
          <fpage>271</fpage>
          -
          <lpage>286</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Song</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Xiong</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chauvel</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Huang</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hu</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mei</surname>
          </string-name>
          , H.:
          <article-title>Generating synchronization engines between running systems and their model-based views</article-title>
          .
          <source>In: Models in Software Engineering</source>
          . Springer (
          <year>2010</year>
          )
          <fpage>140</fpage>
          -
          <lpage>154</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Vogel</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Giese</surname>
          </string-name>
          , H.:
          <article-title>Model-driven engineering of self-adaptive software with eurema</article-title>
          .
          <source>ACM Transactions on Autonomous and Adaptive Systems (TAAS) 8</source>
          (
          <issue>4</issue>
          ) (
          <year>2014</year>
          )
          <fpage>18</fpage>
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>