From ea851fbe4d559710cedd4090139ed295fec357bf Mon Sep 17 00:00:00 2001
From: Benjamin Blanc <benjamin.blanc@tiolive.com>
Date: Wed, 10 Jul 2013 13:45:50 +0200
Subject: [PATCH] request: Add feature to define the requested state.

slapconfiguration: Add feature to get the instance state.
---
 slapos/recipe/request.py           | 12 +++++++++++-
 slapos/recipe/slapconfiguration.py |  8 ++++++--
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/slapos/recipe/request.py b/slapos/recipe/request.py
index ecaad906f..6f4813d0b 100644
--- a/slapos/recipe/request.py
+++ b/slapos/recipe/request.py
@@ -82,8 +82,15 @@ class Recipe(object):
       installation of request section will fail.
       Possible names depend on requested partition's software type.
 
+    state (optional)
+     Requested state, default value is "started".
+
     Output:
       See "return" input key.
+      "instance-state"
+          The current state of the instance.
+      "requested-state"
+          The requested state of the instance.
   """
   failed = None
 
@@ -106,6 +113,7 @@ class Recipe(object):
     ))
     slave = options.get('slave', 'false').lower() in \
       librecipe.GenericBaseRecipe.TRUE_VALUES
+    requested_state = options.get('state', 'started')
     slap = slapmodule.slap()
     slap.initializeConnection(
       options['server-url'],
@@ -123,7 +131,7 @@ class Recipe(object):
     try:
       self.instance = request(software_url, software_type,
           name, partition_parameter_kw=partition_parameter_kw,
-          filter_kw=filter_kw, shared=slave)
+          filter_kw=filter_kw, shared=slave, state=requested_state)
       return_parameter_dict = self._getReturnParameterDict(self.instance,
           return_parameters)
       if not slave:
@@ -147,6 +155,8 @@ class Recipe(object):
       except KeyError:
         if self.failed is None:
           self.failed = param
+    options['requested-state'] = requested_state
+    options['instance-state'] = self.instance.getState()
 
   def _filterForStorage(self, partition_parameter_kw):
     return partition_parameter_kw
diff --git a/slapos/recipe/slapconfiguration.py b/slapos/recipe/slapconfiguration.py
index 09bb31935..5b014f198 100644
--- a/slapos/recipe/slapconfiguration.py
+++ b/slapos/recipe/slapconfiguration.py
@@ -78,6 +78,8 @@ class Recipe(object):
       Partition parameter whose name cannot be represented unambiguously in
       buildout syntax are ignored. They cannot be accessed from buildout syntax
       anyway, and are available through "configuration" output key.
+    instance-state
+      The instance state.
   """
 
   # XXX: used to detect if a configuration key is a valid section key. This
@@ -91,10 +93,12 @@ class Recipe(object):
           options.get('key'),
           options.get('cert'),
       )
-      parameter_dict = slap.registerComputerPartition(
+      computerPartition = slap.registerComputerPartition(
           options['computer'],
           options['partition'],
-      ).getInstanceParameterDict()
+      )
+      parameter_dict = computerPartition.getInstanceParameterDict()
+      options['instance-state'] = computerPartition.getState()
       # XXX: those are not partition parameters, strictly speaking.
       # Make them available as individual section keys.
       for his_key in (
-- 
2.30.9