--- /dev/null
+# vnfproxy
+
+## Overview
+
+This charm layer is intended for use by vendors who wish to integrate with
+OSM. The current release of OSM only supports a lightweight version of Juju
+charms, which we will refer to as "proxy charms". Consider the diagram below:
+
+```
++---------------------+ +---------------------+
+| <----+ |
+| Resource | | Service |
+| Orchestrator (RO) +----> Orchestrator (SO) |
+| | | |
++------------------+--+ +-------+----^--------+
+ | | |
+ | | |
+ | | |
+ +-----v-----+ +-v----+--+
+ | <-------+ |
+ | Virtual | | Proxy |
+ | Machine | | Charm |
+ | +-------> |
+ +-----------+ +---------+
+```
+
+The Virtual Machine (VM) is created by the Resource Orchestrator (RO), at the
+request of the Service Orchestrator (SO). Once the VM has been created, a
+"proxy charm" is deployed in order to facilitate operations between the SO and
+your service running within the VM.
+
+As such, a proxy charm will expose a number of "actions" that are run via the
+SO. By default, the following actions are exposed:
+
+```bash
+actions
+├── reboot
+├── restart
+├── run
+├── start
+└── stop
+```
+
+Some actions, such as `run` and `reboot`, do not require any additional configuration. `start`, `stop` and `restart`, however, will require you to
+implement the command(s) required to interact with your service.
+
+## Usage
+
+Create the framework for your proxy charm:
+
+```bash
+$ charm create pingpong
+$ cd pingpong
+```
+
+Modify `layer.yaml` to the following:
+```yaml
+includes:
+ - layer:basic
+ - layer:vnfproxy
+```
+
+The `metadata.yaml` describes your service. It should look similar to the following:
+
+```yaml
+name: vnfproxy
+summary: A layer for developing OSM "proxy" charms.
+maintainer: Adam Israel <adam.israel@canonical.com>
+description: |
+ VNF "proxy" charms are a lightweight version of a charm that, rather than
+ installing software on the same machine, execute commands over an ssh channel.
+series:
+ - trusty
+ - xenial
+tags:
+ - osm
+ - vnf
+subordinate: false
+```
+
+Implement the default action(s) you wish to support by adding the following code to reactive/pingpong.py and fill in the cmd to be run:
+
+```python
+@when('actions.start')
+def start():
+ err = ''
+ try:
+ cmd = ""
+ result, err = charms.sshproxy._run(cmd)
+ except:
+ action_fail('command failed:' + err)
+ else:
+ action_set({'outout': result})
+ finally:
+ remove_flag('actions.start')
+
+
+@when('actions.stop')
+def stop():
+ err = ''
+ try:
+ # Enter the command to stop your service(s)
+ cmd = "service myname stop"
+ result, err = charms.sshproxy._run(cmd)
+ except:
+ action_fail('command failed:' + err)
+ else:
+ action_set({'outout': result})
+ finally:
+ remove_flag('actions.stop')
+
+
+@when('actions.restart')
+def restart():
+ err = ''
+ try:
+ # Enter the command to restart your service(s)
+ cmd = "service myname restart"
+ result, err = charms.sshproxy._run(cmd)
+ except:
+ action_fail('command failed:' + err)
+ else:
+ action_set({'outout': result})
+ finally:
+ remove_flag('actions.restart')
+```
+
+Rename `README.ex` to `README.md` and describe your application and its usage.
+
+-- fix this. there are cases where the config is useful -- Delete `config.yaml`, since the charm's configuration will be driven by the SO.
+
+Create the `actions.yaml` file; this will describe the additional operations you would like to perform on or against your service.
+
+```yaml
+set-server:
+ description: "Set the target IP address and port"
+ params:
+ server-ip:
+ description: "IP on which the target service is listening."
+ type: string
+ default: ""
+ server-port:
+ description: "Port on which the target service is listening."
+ type: integer
+ default: 5555
+ required:
+ - server-ip
+set-rate:
+ description: "Set the rate of packet generation."
+ params:
+ rate:
+ description: "Packet rate."
+ type: integer
+ default: 5
+get-stats:
+ description: "Get the stats."
+get-state:
+ description: "Get the admin state of the target service."
+get-rate:
+ description: "Get the rate set on the target service."
+get-server:
+ description: "Get the target server and IP set"
+```
+
+
+Once you've implemented your actions, you need to compile the various charm layers:
+```bash
+$ charm build
+
+```
+
+## Contact