diff --git a/osm_ee/__init__.py b/osm_ee/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/osm_ee/__init__.py
diff --git a/osm_ee/__pycache__/__init__.cpython-36.pyc b/osm_ee/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..678249a
--- /dev/null
+++ b/osm_ee/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/__pycache__/base_ee.cpython-36.pyc b/osm_ee/__pycache__/base_ee.cpython-36.pyc
new file mode 100644
index 0000000..f00b8d4
--- /dev/null
+++ b/osm_ee/__pycache__/base_ee.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/__pycache__/exceptions.cpython-36.pyc b/osm_ee/__pycache__/exceptions.cpython-36.pyc
new file mode 100644
index 0000000..b3522d8
--- /dev/null
+++ b/osm_ee/__pycache__/exceptions.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/__pycache__/frontend_client.cpython-36.pyc b/osm_ee/__pycache__/frontend_client.cpython-36.pyc
new file mode 100644
index 0000000..cafe8a1
--- /dev/null
+++ b/osm_ee/__pycache__/frontend_client.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/__pycache__/frontend_grpc.cpython-36.pyc b/osm_ee/__pycache__/frontend_grpc.cpython-36.pyc
new file mode 100644
index 0000000..c73803e
--- /dev/null
+++ b/osm_ee/__pycache__/frontend_grpc.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/__pycache__/frontend_pb2.cpython-36.pyc b/osm_ee/__pycache__/frontend_pb2.cpython-36.pyc
new file mode 100644
index 0000000..0424a29
--- /dev/null
+++ b/osm_ee/__pycache__/frontend_pb2.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/__pycache__/frontend_server.cpython-36.pyc b/osm_ee/__pycache__/frontend_server.cpython-36.pyc
new file mode 100644
index 0000000..d3622cb
--- /dev/null
+++ b/osm_ee/__pycache__/frontend_server.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/base_ee.py b/osm_ee/base_ee.py
new file mode 100644
index 0000000..6728c49
--- /dev/null
+++ b/osm_ee/base_ee.py
@@ -0,0 +1,105 @@
+##
+# Copyright 2019 Telefonica Investigacion y Desarrollo, S.A.U.
+# This file is part of OSM
+# All Rights Reserved.
+#
+# Licensed 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+import asyncio
+import logging
+import yaml
+import os
+
+from osm_ee.vnf.vnf_ee import VnfEE
+
+
+class BaseEE:
+
+    RETURN_STATUS_LIST = ["OK", "PROCESSING", "ERROR"]
+    CONFIG_FILE = "/app/storage/config.yaml"
+    SSH_KEY_FILE = "~/.ssh/id_rsa.pub"
+    HEALTH_CHECK_ACTION = "health-check"
+
+    def __init__(self):
+        self.logger = logging.getLogger('osm_ee.base')
+
+        # Check if configuration is stored and load it
+        if os.path.exists(self.CONFIG_FILE):
+            with open(self.CONFIG_FILE, 'r') as file:
+                self.config_params = yaml.load(file, Loader=yaml.FullLoader)
+                self.logger.debug("Load existing config from file: {}".format(self.config_params))
+        else:
+            self.config_params = {}
+
+        self.vnf_ee = VnfEE(self.config_params)
+
+    async def get_ssh_key(self):
+        self.logger.debug("Obtain ssh key")
+        filename = os.path.expanduser(self.SSH_KEY_FILE)
+        with open(filename) as reader:
+            ssh_key = reader.read()
+        return ssh_key
+
+    async def run_action(self, id, name, params):
+        self.logger.debug("Execute action id: {}, name: {}, params: {}".format(id, name, params))
+
+        try:
+            # Health-check
+            if name == self.HEALTH_CHECK_ACTION:
+                yield "OK", "Health-check ok"
+            else:
+
+                # Obtain dynamically code to be executed
+                method = getattr(self.vnf_ee, name)
+
+                # Convert params from yaml format
+                action_params = yaml.safe_load(params)
+
+                if name == "config":
+                    self.logger.debug("Store config info in file: {}".format(self.CONFIG_FILE))
+                    self.config_params.update(action_params)
+                    with open(self.CONFIG_FILE, 'w') as file:
+                        config = yaml.dump(self.config_params, file)
+
+                async for return_status, detailed_message in method(id, action_params):
+                    if return_status not in self.RETURN_STATUS_LIST:
+                        yield "ERROR", "Invalid return status"
+                    else:
+                        yield return_status, str(detailed_message)
+        except AttributeError as e:
+            error_msg = "Action name: {} not implemented".format(name)
+            self.logger.error(error_msg)
+            yield "ERROR", error_msg
+        except Exception as e:
+            self.logger.error("Error executing action id, name: {},{}: {}".format(id, name, str(e)), exc_info=True)
+            yield "ERROR", str(e)
+
+
+if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
+
+    loop = asyncio.get_event_loop()
+    try:
+        ee = BaseEE()
+        id = "test1"
+        name = "touch2"
+        params = {"file_path": "/var/tmp/testfile1.txt"}
+        action = asyncio.ensure_future(ee.run_action(id, name, params))
+        loop.run_until_complete(action)
+    finally:
+        loop.close()
diff --git a/osm_ee/exceptions.py b/osm_ee/exceptions.py
new file mode 100644
index 0000000..4829197
--- /dev/null
+++ b/osm_ee/exceptions.py
@@ -0,0 +1,27 @@
+##
+# Copyright 2019 Telefonica Investigacion y Desarrollo, S.A.U.
+# This file is part of OSM
+# All Rights Reserved.
+#
+# Licensed 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+class ExecEnvException(Exception):
+    """Exception thrown by the EE if the actions can't be invoked or there is any generic error"""
+
+class VnfException(Exception):
+    """Exception thrown by the Vnf EE code in case of error"""
\ No newline at end of file
diff --git a/osm_ee/frontend.proto b/osm_ee/frontend.proto
new file mode 100644
index 0000000..36d0158
--- /dev/null
+++ b/osm_ee/frontend.proto
@@ -0,0 +1,39 @@
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "com.etsi.osm.lcm.osm_ee";
+option java_outer_classname = "GrpcExecutor";
+option objc_class_prefix = "OEE";
+
+package osm_ee;
+
+service FrontendExecutor {
+
+    // Execute action leaving open a channel for notifications
+    rpc RunPrimitive (PrimitiveRequest) returns (stream PrimitiveReply) {}
+
+    // Sends a greeting
+    rpc GetSshKey (SshKeyRequest) returns (SshKeyReply) {}
+}
+
+// Request parameters
+message PrimitiveRequest {
+    string id=1;
+    string name=2;
+    string params=3;
+}
+
+message PrimitiveReply {
+    string status=1;
+    string detailed_message=2;
+}
+
+// The request message containing the user's name.
+message SshKeyRequest {
+  // empty
+}
+
+// The response message containing the greetings
+message SshKeyReply {
+  string message = 1;
+}
diff --git a/osm_ee/frontend_client.py b/osm_ee/frontend_client.py
new file mode 100644
index 0000000..0c34580
--- /dev/null
+++ b/osm_ee/frontend_client.py
@@ -0,0 +1,85 @@
+##
+# Copyright 2019 Telefonica Investigacion y Desarrollo, S.A.U.
+# This file is part of OSM
+# All Rights Reserved.
+#
+# Licensed 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+import sys
+import yaml
+import asyncio
+import uuid
+import traceback
+import os
+import socket
+
+from grpclib.client import Channel
+
+from osm_ee.frontend_pb2 import PrimitiveRequest, PrimitiveReply
+from osm_ee.frontend_pb2 import SshKeyRequest, SshKeyReply
+from osm_ee.frontend_grpc import FrontendExecutorStub
+
+
+async def frontend_client(host_name, port, primitive_name, params):
+
+    ip_addr = socket.gethostbyname(host_name)
+    channel = Channel(ip_addr, port)
+    try:
+        stub = FrontendExecutorStub(channel)
+
+        if (primitive_name == "get_ssh_key"):
+            print("Get ssh key")
+            reply: SshKeyReply = await stub.GetSshKey(SshKeyRequest())
+            print(reply.message)
+        else:
+            async with stub.RunPrimitive.open() as stream:
+                primitive_id = str(uuid.uuid1())
+                print("Execute primitive {}, params: {}".format(primitive_name, params))
+                await stream.send_message(
+                    PrimitiveRequest(id=primitive_id, name=primitive_name, params=yaml.dump(params)), end=True)
+                async for reply in stream:
+                    print(reply)
+                #replies = [reply async for reply in stream]
+                #print(replies)
+    except Exception as e:
+        print("Error executing primitive {}: {}".format(primitive_name, str(e)))
+        #print(traceback.format_exc())
+    finally:
+        channel.close()
+
+
+if __name__ == '__main__':
+
+    args = sys.argv[1:]
+    if (len(args) < 1):
+        print("Usage: host port primitive_name params")
+    else:
+        host_name = args[0]
+        port = args[1]
+        primitive_name = args[2]
+        arg_params = args[3] if len(args) >= 4 else ""
+        print(primitive_name)
+        print(arg_params)
+        params = yaml.safe_load(arg_params)
+
+        loop = asyncio.get_event_loop()
+        try:
+            task = asyncio.ensure_future(frontend_client(host_name, port, primitive_name, params))
+            loop.run_until_complete(task)
+        finally:
+            loop.close()
diff --git a/osm_ee/frontend_grpc.py b/osm_ee/frontend_grpc.py
new file mode 100644
index 0000000..b2b95d3
--- /dev/null
+++ b/osm_ee/frontend_grpc.py
@@ -0,0 +1,56 @@
+# Generated by the Protocol Buffers compiler. DO NOT EDIT!
+# source: osm_ee/frontend.proto
+# plugin: grpclib.plugin.main
+import abc
+import typing
+
+import grpclib.const
+import grpclib.client
+if typing.TYPE_CHECKING:
+    import grpclib.server
+
+import osm_ee.frontend_pb2
+
+
+class FrontendExecutorBase(abc.ABC):
+
+    @abc.abstractmethod
+    async def RunPrimitive(self, stream: 'grpclib.server.Stream[osm_ee.frontend_pb2.PrimitiveRequest, osm_ee.frontend_pb2.PrimitiveReply]') -> None:
+        pass
+
+    @abc.abstractmethod
+    async def GetSshKey(self, stream: 'grpclib.server.Stream[osm_ee.frontend_pb2.SshKeyRequest, osm_ee.frontend_pb2.SshKeyReply]') -> None:
+        pass
+
+    def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
+        return {
+            '/osm_ee.FrontendExecutor/RunPrimitive': grpclib.const.Handler(
+                self.RunPrimitive,
+                grpclib.const.Cardinality.UNARY_STREAM,
+                osm_ee.frontend_pb2.PrimitiveRequest,
+                osm_ee.frontend_pb2.PrimitiveReply,
+            ),
+            '/osm_ee.FrontendExecutor/GetSshKey': grpclib.const.Handler(
+                self.GetSshKey,
+                grpclib.const.Cardinality.UNARY_UNARY,
+                osm_ee.frontend_pb2.SshKeyRequest,
+                osm_ee.frontend_pb2.SshKeyReply,
+            ),
+        }
+
+
+class FrontendExecutorStub:
+
+    def __init__(self, channel: grpclib.client.Channel) -> None:
+        self.RunPrimitive = grpclib.client.UnaryStreamMethod(
+            channel,
+            '/osm_ee.FrontendExecutor/RunPrimitive',
+            osm_ee.frontend_pb2.PrimitiveRequest,
+            osm_ee.frontend_pb2.PrimitiveReply,
+        )
+        self.GetSshKey = grpclib.client.UnaryUnaryMethod(
+            channel,
+            '/osm_ee.FrontendExecutor/GetSshKey',
+            osm_ee.frontend_pb2.SshKeyRequest,
+            osm_ee.frontend_pb2.SshKeyReply,
+        )
diff --git a/osm_ee/frontend_pb2.py b/osm_ee/frontend_pb2.py
new file mode 100644
index 0000000..8cdc485
--- /dev/null
+++ b/osm_ee/frontend_pb2.py
@@ -0,0 +1,233 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: osm_ee/frontend.proto
+
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='osm_ee/frontend.proto',
+  package='osm_ee',
+  syntax='proto3',
+  serialized_options=b'\n\027com.etsi.osm.lcm.osm_eeB\014GrpcExecutorP\001\242\002\003OEE',
+  serialized_pb=b'\n\x15osm_ee/frontend.proto\x12\x06osm_ee\"<\n\x10PrimitiveRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06params\x18\x03 \x01(\t\":\n\x0ePrimitiveReply\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x18\n\x10\x64\x65tailed_message\x18\x02 \x01(\t\"\x0f\n\rSshKeyRequest\"\x1e\n\x0bSshKeyReply\x12\x0f\n\x07message\x18\x01 \x01(\t2\x93\x01\n\x10\x46rontendExecutor\x12\x44\n\x0cRunPrimitive\x12\x18.osm_ee.PrimitiveRequest\x1a\x16.osm_ee.PrimitiveReply\"\x00\x30\x01\x12\x39\n\tGetSshKey\x12\x15.osm_ee.SshKeyRequest\x1a\x13.osm_ee.SshKeyReply\"\x00\x42/\n\x17\x63om.etsi.osm.lcm.osm_eeB\x0cGrpcExecutorP\x01\xa2\x02\x03OEEb\x06proto3'
+)
+
+
+
+
+_PRIMITIVEREQUEST = _descriptor.Descriptor(
+  name='PrimitiveRequest',
+  full_name='osm_ee.PrimitiveRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='osm_ee.PrimitiveRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='osm_ee.PrimitiveRequest.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='params', full_name='osm_ee.PrimitiveRequest.params', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=33,
+  serialized_end=93,
+)
+
+
+_PRIMITIVEREPLY = _descriptor.Descriptor(
+  name='PrimitiveReply',
+  full_name='osm_ee.PrimitiveReply',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='osm_ee.PrimitiveReply.status', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='detailed_message', full_name='osm_ee.PrimitiveReply.detailed_message', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=95,
+  serialized_end=153,
+)
+
+
+_SSHKEYREQUEST = _descriptor.Descriptor(
+  name='SshKeyRequest',
+  full_name='osm_ee.SshKeyRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=155,
+  serialized_end=170,
+)
+
+
+_SSHKEYREPLY = _descriptor.Descriptor(
+  name='SshKeyReply',
+  full_name='osm_ee.SshKeyReply',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='message', full_name='osm_ee.SshKeyReply.message', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=172,
+  serialized_end=202,
+)
+
+DESCRIPTOR.message_types_by_name['PrimitiveRequest'] = _PRIMITIVEREQUEST
+DESCRIPTOR.message_types_by_name['PrimitiveReply'] = _PRIMITIVEREPLY
+DESCRIPTOR.message_types_by_name['SshKeyRequest'] = _SSHKEYREQUEST
+DESCRIPTOR.message_types_by_name['SshKeyReply'] = _SSHKEYREPLY
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+PrimitiveRequest = _reflection.GeneratedProtocolMessageType('PrimitiveRequest', (_message.Message,), {
+  'DESCRIPTOR' : _PRIMITIVEREQUEST,
+  '__module__' : 'osm_ee.frontend_pb2'
+  # @@protoc_insertion_point(class_scope:osm_ee.PrimitiveRequest)
+  })
+_sym_db.RegisterMessage(PrimitiveRequest)
+
+PrimitiveReply = _reflection.GeneratedProtocolMessageType('PrimitiveReply', (_message.Message,), {
+  'DESCRIPTOR' : _PRIMITIVEREPLY,
+  '__module__' : 'osm_ee.frontend_pb2'
+  # @@protoc_insertion_point(class_scope:osm_ee.PrimitiveReply)
+  })
+_sym_db.RegisterMessage(PrimitiveReply)
+
+SshKeyRequest = _reflection.GeneratedProtocolMessageType('SshKeyRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SSHKEYREQUEST,
+  '__module__' : 'osm_ee.frontend_pb2'
+  # @@protoc_insertion_point(class_scope:osm_ee.SshKeyRequest)
+  })
+_sym_db.RegisterMessage(SshKeyRequest)
+
+SshKeyReply = _reflection.GeneratedProtocolMessageType('SshKeyReply', (_message.Message,), {
+  'DESCRIPTOR' : _SSHKEYREPLY,
+  '__module__' : 'osm_ee.frontend_pb2'
+  # @@protoc_insertion_point(class_scope:osm_ee.SshKeyReply)
+  })
+_sym_db.RegisterMessage(SshKeyReply)
+
+
+DESCRIPTOR._options = None
+
+_FRONTENDEXECUTOR = _descriptor.ServiceDescriptor(
+  name='FrontendExecutor',
+  full_name='osm_ee.FrontendExecutor',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=205,
+  serialized_end=352,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='RunPrimitive',
+    full_name='osm_ee.FrontendExecutor.RunPrimitive',
+    index=0,
+    containing_service=None,
+    input_type=_PRIMITIVEREQUEST,
+    output_type=_PRIMITIVEREPLY,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetSshKey',
+    full_name='osm_ee.FrontendExecutor.GetSshKey',
+    index=1,
+    containing_service=None,
+    input_type=_SSHKEYREQUEST,
+    output_type=_SSHKEYREPLY,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_FRONTENDEXECUTOR)
+
+DESCRIPTOR.services_by_name['FrontendExecutor'] = _FRONTENDEXECUTOR
+
+# @@protoc_insertion_point(module_scope)
diff --git a/osm_ee/frontend_server.py b/osm_ee/frontend_server.py
new file mode 100644
index 0000000..079503d
--- /dev/null
+++ b/osm_ee/frontend_server.py
@@ -0,0 +1,89 @@
+##
+# Copyright 2019 Telefonica Investigacion y Desarrollo, S.A.U.
+# This file is part of OSM
+# All Rights Reserved.
+#
+# Licensed 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+import asyncio
+import logging
+import os
+
+from grpclib.utils import graceful_exit
+from grpclib.server import Server, Stream
+
+from osm_ee.frontend_grpc import FrontendExecutorBase
+from osm_ee.frontend_pb2 import PrimitiveRequest, PrimitiveReply
+from osm_ee.frontend_pb2 import SshKeyRequest, SshKeyReply
+
+from osm_ee.base_ee import BaseEE
+import osm_ee.util.util_ee as util_ee
+
+
+class FrontendExecutor(FrontendExecutorBase):
+
+    def __init__(self):
+        self.logger = logging.getLogger('osm_ee.frontend_server')
+        self.base_ee = BaseEE()
+
+    async def RunPrimitive(self, stream: Stream[PrimitiveRequest, PrimitiveReply]) -> None:
+        request = await stream.recv_message()
+        try:
+            self.logger.debug(f'Run primitive: id {request.id}, name: {request.name}, params: {request.params}')
+            async for status, detailed_message in self.base_ee.run_action(request.id, request.name, request.params):
+                self.logger.debug(f'Send response {status}, {detailed_message}')
+                await stream.send_message(
+                    PrimitiveReply(status=status, detailed_message=detailed_message))
+        except Exception as e:
+            self.logger.debug(f'Error executing primitive: id {request.id}, name: {request.name}, error_msg: {str(e)}')
+            await stream.send_message(
+                PrimitiveReply(status="ERROR", detailed_message=str(e)))
+
+    async def GetSshKey(self, stream: Stream[SshKeyRequest, SshKeyReply]) -> None:
+        request = await stream.recv_message()
+        assert request is not None
+        message = await self.base_ee.get_ssh_key()
+        await stream.send_message(SshKeyReply(message=message))
+
+
+async def main(*, host: str = '0.0.0.0', port: int = 50051) -> None:
+    logging.basicConfig()
+    logger = logging.getLogger('osm_ee')
+    logger.setLevel(logging.DEBUG)
+
+    # Generate ssh key
+    file_dir = os.path.expanduser("~/.ssh/id_rsa")
+    command = "ssh-keygen -q -t rsa -N '' -f {}".format(file_dir)
+    return_code, stdout, stderr = await util_ee.local_async_exec(command)
+    logger.debug("Generated ssh_key, return_code: {}".format(return_code))
+
+    # Start server
+    server = Server([FrontendExecutor()])
+    with graceful_exit([server]):
+        await server.start(host, port)
+        logging.getLogger('osm_ee.frontend_server').debug(f'Serving on {host}:{port}')
+        await server.wait_closed()
+
+
+if __name__ == '__main__':
+    loop = asyncio.get_event_loop()
+    try:
+        main_task = asyncio.ensure_future(main())
+        loop.run_until_complete(main_task)
+    finally:
+        loop.close()
diff --git a/osm_ee/scripts/ee_start.sh b/osm_ee/scripts/ee_start.sh
new file mode 100755
index 0000000..0364dc4
--- /dev/null
+++ b/osm_ee/scripts/ee_start.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+##
+# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U.
+# Licensed 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.
+##
+
+# This script is intended for launching RO from a docker container.
+# It waits for mysql server ready, normally running on a separate container, ...
+# then it checks if database is present and creates it if needed.
+# Finally it launches RO server.
+
+EE_PATH=/app/EE
+
+# Install vnf vendor additional required libraries
+echo "Install additional libraries"
+bash ${EE_PATH}/osm_ee/vnf/install.sh
+
+# Start frontend
+echo "Starting frontend server"
+python3 -m osm_ee.frontend_server
diff --git a/osm_ee/util/__init__.py b/osm_ee/util/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/osm_ee/util/__init__.py
diff --git a/osm_ee/util/__pycache__/__init__.cpython-36.pyc b/osm_ee/util/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..138334b
--- /dev/null
+++ b/osm_ee/util/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/util/__pycache__/util_ansible.cpython-36.pyc b/osm_ee/util/__pycache__/util_ansible.cpython-36.pyc
new file mode 100644
index 0000000..d6cbaeb
--- /dev/null
+++ b/osm_ee/util/__pycache__/util_ansible.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/util/__pycache__/util_ee.cpython-36.pyc b/osm_ee/util/__pycache__/util_ee.cpython-36.pyc
new file mode 100644
index 0000000..2c6940c
--- /dev/null
+++ b/osm_ee/util/__pycache__/util_ee.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/util/util_ansible.py b/osm_ee/util/util_ansible.py
new file mode 100644
index 0000000..8f27875
--- /dev/null
+++ b/osm_ee/util/util_ansible.py
@@ -0,0 +1,46 @@
+##
+# Copyright 2019 Telefonica Investigacion y Desarrollo, S.A.U.
+# This file is part of OSM
+# All Rights Reserved.
+#
+# Licensed 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+import logging
+import json
+from shlex import quote
+
+import osm_ee.util.util_ee as util_ee
+
+logger = logging.getLogger("osm_ee.util_ansible")
+
+
+async def execute_playbook(playbook_name: str, inventory: str, extra_vars: dict,
+                           ) -> (int, str):
+
+    command = 'ansible-playbook --inventory={} --extra-vars {} {}'.format(quote(inventory),
+                                                                          quote(json.dumps(extra_vars)),
+                                                                          quote(playbook_name))
+
+    logger.debug("Command to be executed: {}".format(command))
+
+    return_code, stdout, stderr = await util_ee.local_async_exec(command)
+    logger.debug("Return code: {}".format(return_code))
+    logger.debug("stdout: {}".format(stdout))
+    logger.debug("stderr: {}".format(stderr))
+
+    return return_code, stdout, stderr
diff --git a/osm_ee/util/util_ee.py b/osm_ee/util/util_ee.py
new file mode 100644
index 0000000..1d0a232
--- /dev/null
+++ b/osm_ee/util/util_ee.py
@@ -0,0 +1,60 @@
+##
+# Copyright 2019 Telefonica Investigacion y Desarrollo, S.A.U.
+# This file is part of OSM
+# All Rights Reserved.
+#
+# Licensed 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+import logging
+import asyncio
+from shlex import split
+
+logger = logging.getLogger("osm_ee.util")
+
+
+async def local_async_exec(command: str
+                           ) -> (int, str, str):
+    """
+        Executed a local command using asyncio.
+        TODO - do not know yet if return error code, and stdout and strerr or just one of them
+    """
+    scommand = split(command)
+
+    logger.debug("Execute local command: {}".format(command))
+    process = await asyncio.create_subprocess_exec(
+        *scommand,
+        stdout=asyncio.subprocess.PIPE,
+        stderr=asyncio.subprocess.PIPE
+    )
+
+    # wait for command terminate
+    stdout, stderr = await process.communicate()
+
+    return_code = process.returncode
+    logger.debug("Return code: {}".format(return_code))
+
+    output = ""
+    if stdout:
+        output = stdout.decode()
+        logger.debug("Output: {}".format(output))
+
+    if stderr:
+        out_err = stderr.decode()
+        logger.debug("Stderr: {}".format(out_err))
+
+    return return_code, stdout, stderr
diff --git a/osm_ee/vnf/__init__.py b/osm_ee/vnf/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/osm_ee/vnf/__init__.py
diff --git a/osm_ee/vnf/__pycache__/__init__.cpython-36.pyc b/osm_ee/vnf/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..70afb9e
--- /dev/null
+++ b/osm_ee/vnf/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/vnf/__pycache__/vnf_ee.cpython-36.pyc b/osm_ee/vnf/__pycache__/vnf_ee.cpython-36.pyc
new file mode 100644
index 0000000..27ab0d3
--- /dev/null
+++ b/osm_ee/vnf/__pycache__/vnf_ee.cpython-36.pyc
Binary files differ
diff --git a/osm_ee/vnf/install.sh b/osm_ee/vnf/install.sh
new file mode 100644
index 0000000..e0e56ff
--- /dev/null
+++ b/osm_ee/vnf/install.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+##
+# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U.
+# Licensed 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.
+##
+
+# This script is intended for launching RO from a docker container.
+# It waits for mysql server ready, normally running on a separate container, ...
+# then it checks if database is present and creates it if needed.
+# Finally it launches RO server.
+
+echo "Sample install.sh "
\ No newline at end of file
diff --git a/osm_ee/vnf/vnf_ee.py b/osm_ee/vnf/vnf_ee.py
new file mode 100644
index 0000000..10c2e33
--- /dev/null
+++ b/osm_ee/vnf/vnf_ee.py
@@ -0,0 +1,54 @@
+##
+# Copyright 2019 Telefonica Investigacion y Desarrollo, S.A.U.
+# This file is part of OSM
+# All Rights Reserved.
+#
+# Licensed 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.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+import asyncio
+import logging
+
+from osm_ee.exceptions import VnfException
+
+
+class VnfEE:
+
+    def __init__(self, config_params):
+        self.logger = logging.getLogger('osm_ee.vnf')
+        self.config_params = config_params
+
+    async def config(self, id, params):
+        self.logger.debug("Execute action config params: {}".format(params))
+        # Config action is special, params are merged with previous config calls
+        self.config_params.update(params)
+        yield "OK", "Configured"
+
+    async def sleep(self, id, params):
+        self.logger.debug("Execute action sleep, params: {}".format(params))
+
+        for i in range(3):
+            await asyncio.sleep(5)
+            self.logger.debug("Temporal result return, params: {}".format(params))
+            yield "PROCESSING", f"Processing {i} action id {id}"
+        yield "OK", f"Processed action id {id}"
+
+    @staticmethod
+    def _check_required_params(params, required_params):
+        for required_param in required_params:
+            if required_param not in params:
+                raise VnfException("Missing required param: {}".format(required_param))
