From 6b1ce24875cd5c72ad9bf89c03cf3b2727139a84 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Le=20Ninivin?= <cedric.leninivin@tiolive.com>
Date: Fri, 7 Sep 2012 17:15:42 +0200
Subject: [PATCH] Added 4 Timestamp tests

---
 slapos/tests/slapgrid.py | 426 ++++++++++++++++++---------------------
 1 file changed, 192 insertions(+), 234 deletions(-)

diff --git a/slapos/tests/slapgrid.py b/slapos/tests/slapgrid.py
index e65acafa5f..77ea3ff37a 100644
--- a/slapos/tests/slapgrid.py
+++ b/slapos/tests/slapgrid.py
@@ -66,51 +66,6 @@ class TestBasicSlapgridCP(BasicMixin, unittest.TestCase):
 
 class MasterMixin(BasicMixin):
 
-  def _server_response (self,_requested_state,timestamp=None):
-    def server_response(self_httplib, path, method, body, header):
-      parsed_url = urlparse.urlparse(path.lstrip('/'))
-      self.sequence.append(parsed_url.path)      
-      if method == 'GET':
-        parsed_qs = urlparse.parse_qs(parsed_url.query)
-      else:
-        parsed_qs = urlparse.parse_qs(body)
-      if parsed_url.path == 'getFullComputerInformation' and \
-            'computer_id' in parsed_qs:
-        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0])
-        slap_computer._software_release_list = []
-        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'][0],
-                                                  '0')
-        sr = slapos.slap.SoftwareRelease()
-        sr._software_release = 'http://sr/'
-        partition._software_release_document = sr
-        partition._requested_state = _requested_state
-        if not timestamp == None :
-          partition._parameter_dict = {'timestamp': timestamp} 
-          slap_computer._computer_partition_list = [partition]
-          return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
-      if parsed_url.path == 'availableComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      if parsed_url.path == 'startedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-        self.started = True
-        return (200, {}, '')
-      if parsed_url.path == 'stoppedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-        self.stopped = True
-        return (200, {}, '')
-      if parsed_url.path == 'softwareInstanceError' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        self.error = True
-        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-        return (200, {}, '')
-      else:
-        return (404, {}, '')
-    return server_response
-
-
   def _patchHttplib(self):
     """Overrides httplib"""
     import mock.httplib
@@ -176,6 +131,54 @@ touch worked""")
     BasicMixin.tearDown(self)
 
 
+def _server_response (self_test,_requested_state,timestamp=None):
+  def server_response(self_httplib, path, method, body, header):
+    parsed_url = urlparse.urlparse(path.lstrip('/'))
+    self_test.sequence.append(parsed_url.path)      
+    if method == 'GET':
+      parsed_qs = urlparse.parse_qs(parsed_url.query)
+    else:
+      parsed_qs = urlparse.parse_qs(body)
+    if parsed_url.path == 'getFullComputerInformation' and \
+          'computer_id' in parsed_qs:
+      slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0])
+      slap_computer._software_release_list = []
+      partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'][0],
+                                                '0')
+      sr = slapos.slap.SoftwareRelease()
+      sr._software_release = 'http://sr/'
+      partition._software_release_document = sr
+      partition._requested_state = _requested_state
+      if not timestamp == None :
+        partition._parameter_dict = {'timestamp': timestamp} 
+      slap_computer._computer_partition_list = [partition]
+      return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
+    if parsed_url.path == 'availableComputerPartition' and \
+          method == 'POST' and 'computer_partition_id' in parsed_qs:
+      return (200, {}, '')
+    if parsed_url.path == 'startedComputerPartition' and \
+          method == 'POST' and 'computer_partition_id' in parsed_qs:
+      self_test.assertEqual(parsed_qs['computer_partition_id'][0], '0')
+      self_test.started = True
+      return (200, {}, '')
+    if parsed_url.path == 'stoppedComputerPartition' and \
+          method == 'POST' and 'computer_partition_id' in parsed_qs:
+      self_test.assertEqual(parsed_qs['computer_partition_id'][0], '0')
+      self_test.stopped = True
+      return (200, {}, '')
+    if parsed_url.path == 'softwareInstanceError' and \
+          method == 'POST' and 'computer_partition_id' in parsed_qs:
+      self_test.error = True
+      self_test.assertEqual(parsed_qs['computer_partition_id'][0], '0')
+      return (200, {}, '')
+    else:
+      return (404, {}, '')
+  
+  return server_response
+
+
+
+
 class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
 
   def test_nothing_to_do(self):
@@ -200,36 +203,10 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
     self.assertSortedListEqual(os.listdir(self.software_root), [])
 
   def test_one_partition(self):
-    def server_response(self_httplib, path, method, body, header):
-      parsed_url = urlparse.urlparse(path.lstrip('/'))
-      self.sequence.append(parsed_url.path)
-      if method == 'GET':
-        parsed_qs = urlparse.parse_qs(parsed_url.query)
-      else:
-        parsed_qs = urlparse.parse_qs(body)
-      if parsed_url.path == 'getFullComputerInformation' and \
-         'computer_id' in parsed_qs:
-        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'])
-        slap_computer._software_release_list = []
-        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'],
-            '0')
-        sr = slapos.slap.SoftwareRelease()
-        sr._software_release = 'http://sr/'
-        partition._software_release_document = sr
-        partition._requested_state = 'stopped'
-        slap_computer._computer_partition_list = [partition]
-        return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
-      if parsed_url.path == 'availableComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      if parsed_url.path == 'stoppedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      else:
-        return (404, {}, '')
 
-    httplib.HTTPConnection._callback = server_response
     self.sequence = []
+    httplib.HTTPConnection._callback = _server_response(self,
+      _requested_state='stopped')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -259,39 +236,9 @@ touch worked""")
 
   def test_one_partition_started(self):
 
-    def server_response(self_httplib, path, method, body, header):
-      parsed_url = urlparse.urlparse(path.lstrip('/'))
-      self.sequence.append(parsed_url.path)
-      if method == 'GET':
-        parsed_qs = urlparse.parse_qs(parsed_url.query)
-      else:
-        parsed_qs = urlparse.parse_qs(body)
-      if parsed_url.path == 'getFullComputerInformation' and \
-         'computer_id' in parsed_qs:
-        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'])
-        slap_computer._software_release_list = []
-        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'],
-            '0')
-        sr = slapos.slap.SoftwareRelease()
-        sr._software_release = 'http://sr/'
-        partition._software_release_document = sr
-        partition._requested_state = 'started'
-        slap_computer._computer_partition_list = [partition]
-        return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
-      if parsed_url.path == 'availableComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      if parsed_url.path == 'startedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-        self.started = True
-        return (200, {}, '')
-      else:
-        return (404, {}, '')
-
-    httplib.HTTPConnection._callback = server_response
     self.sequence = []
     self.started = False
+    httplib.HTTPConnection._callback = _server_response(self,'started')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -335,39 +282,9 @@ chmod 755 etc/run/wrapper
 
   def test_one_partition_started_stopped(self):
 
-    def server_response(self_httplib, path, method, body, header):
-      parsed_url = urlparse.urlparse(path.lstrip('/'))
-      self.sequence.append(parsed_url.path)
-      if method == 'GET':
-        parsed_qs = urlparse.parse_qs(parsed_url.query)
-      else:
-        parsed_qs = urlparse.parse_qs(body)
-      if parsed_url.path == 'getFullComputerInformation' and \
-         'computer_id' in parsed_qs:
-        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'])
-        slap_computer._software_release_list = []
-        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'],
-            '0')
-        sr = slapos.slap.SoftwareRelease()
-        sr._software_release = 'http://sr/'
-        partition._software_release_document = sr
-        partition._requested_state = 'started'
-        slap_computer._computer_partition_list = [partition]
-        return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) 
-      if parsed_url.path == 'availableComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      if parsed_url.path == 'startedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-        self.started = True
-        return (200, {}, '')
-      else:
-        return (404, {}, '')
-
-    httplib.HTTPConnection._callback = server_response
     self.started = True
     self.sequence = []
+    httplib.HTTPConnection._callback = _server_response(self,'started')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -419,39 +336,11 @@ chmod 755 etc/run/wrapper
                      ['getFullComputerInformation', 'availableComputerPartition',
                       'startedComputerPartition'])
     self.assertTrue(self.started)
-    def server_response(self_httplib, path, method, body, header):
-      parsed_url = urlparse.urlparse(path.lstrip('/'))
-      self.sequence.append(parsed_url.path)
-      if method == 'GET':
-        parsed_qs = urlparse.parse_qs(parsed_url.query)
-      else:
-        parsed_qs = urlparse.parse_qs(body)
-      if parsed_url.path == 'getFullComputerInformation' and \
-         'computer_id' in parsed_qs:
-        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'])
-        slap_computer._software_release_list = []
-        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'],
-            '0')
-        sr = slapos.slap.SoftwareRelease()
-        sr._software_release = 'http://sr/'
-        partition._software_release_document = sr
-        partition._requested_state = 'stopped'
-        slap_computer._computer_partition_list = [partition]
-        return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
-      if parsed_url.path == 'availableComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      if parsed_url.path == 'stoppedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-        self.stopped = True
-        return (200, {}, '')
-      else:
-        return (404, {}, '')
-    httplib.HTTPConnection._callback = server_response
+
     self.stopped = False
     self.sequence = []
     self.setSlapgrid()
+    httplib.HTTPConnection._callback = _server_response(self,'stopped')
 
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
@@ -475,39 +364,9 @@ chmod 755 etc/run/wrapper
 
   def test_one_partition_stopped_started(self):
 
-    def server_response(self_httplib, path, method, body, header):
-      parsed_url = urlparse.urlparse(path.lstrip('/'))
-      self.sequence.append(parsed_url.path)
-      if method == 'GET':
-        parsed_qs = urlparse.parse_qs(parsed_url.query)
-      else:
-        parsed_qs = urlparse.parse_qs(body)
-      if parsed_url.path == 'getFullComputerInformation' and \
-         'computer_id' in parsed_qs:
-        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'])
-        slap_computer._software_release_list = []
-        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'],
-            '0')
-        sr = slapos.slap.SoftwareRelease()
-        sr._software_release = 'http://sr/'
-        partition._software_release_document = sr
-        partition._requested_state = 'stopped'
-        slap_computer._computer_partition_list = [partition]
-        return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
-      if parsed_url.path == 'availableComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      if parsed_url.path == 'stoppedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-        self.stopped = True
-        return (200, {}, '')
-      else:
-        return (404, {}, '')
-
-    httplib.HTTPConnection._callback = server_response
     self.stopped = False
     self.sequence = []
+    httplib.HTTPConnection._callback = _server_response(self,'stopped')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -541,37 +400,9 @@ chmod 755 etc/run/wrapper
                       'stoppedComputerPartition'])
     self.assertTrue(self.stopped)
 
-    def server_response(self_httplib, path, method, body, header):
-      parsed_url = urlparse.urlparse(path.lstrip('/'))
-      self.sequence.append(parsed_url.path)
-      if method == 'GET':
-        parsed_qs = urlparse.parse_qs(parsed_url.query)
-      else:
-        parsed_qs = urlparse.parse_qs(body)
-      if parsed_url.path == 'getFullComputerInformation' and \
-         'computer_id' in parsed_qs:
-        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'])
-        slap_computer._software_release_list = []
-        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'],
-            '0')
-        sr = slapos.slap.SoftwareRelease()
-        sr._software_release = 'http://sr/'
-        partition._software_release_document = sr
-        partition._requested_state = 'started'
-        slap_computer._computer_partition_list = [partition]
-        return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
-      if parsed_url.path == 'availableComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      if parsed_url.path == 'startedComputerPartition' and \
-            method == 'POST' and 'computer_partition_id' in parsed_qs:
-        return (200, {}, '')
-      else:
-        return (404, {}, '')
-
-    httplib.HTTPConnection._callback = server_response
-    self.started = True
+    self.started = False
     self.sequence = []
+    httplib.HTTPConnection._callback = _server_response(self,'started')
 
     self.setSlapgrid()
     self.assertTrue(self.grid.processComputerPartitionList())
@@ -602,7 +433,7 @@ class TestSlapgridCPPartitionProcessing (MasterMixin, unittest.TestCase):
     self.sequence = []
     self.timestamp = str(int(time.time()))
     self.started = False
-    httplib.HTTPConnection._callback = self._server_response('stopped',
+    httplib.HTTPConnection._callback = _server_response(self,'stopped',
                                                              self.timestamp)
 
     os.mkdir(self.software_root)
@@ -626,12 +457,12 @@ touch worked""")
     self.assertSortedListEqual(os.listdir(partition), ['.timestamp','worked',
       'buildout.cfg'])
     self.assertSortedListEqual(os.listdir(self.software_root),
-      [software_hash])
+      [software_hash])    
+    timestamp_path = os.path.join(partition_path, '.timestamp')
 
-    self.setSlapgrid()
-    
-    print self.grid.develop
+    self.setSlapgrid()    
     self.assertTrue(self.grid.processComputerPartitionList())
+    self.assertTrue(self.timestamp in open(timestamp_path,'r').read())
     self.assertEqual(self.sequence,
                      ['getFullComputerInformation', 'availableComputerPartition',
                       'stoppedComputerPartition', 'getFullComputerInformation'])
@@ -642,9 +473,8 @@ touch worked""")
     self.sequence = []
     self.timestamp = str(int(time.time()))
     self.started = False
-    httplib.HTTPConnection._callback = self._server_response('stopped',
+    httplib.HTTPConnection._callback = _server_response(self,'stopped',
                                                              self.timestamp)
-
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
     partition_path = os.path.join(self.instance_root, '0')
@@ -669,7 +499,135 @@ touch worked""")
       [software_hash])
 
     self.setSlapgrid(develop=True)
-    
+    self.assertTrue(self.grid.processComputerPartitionList())
+
+    self.setSlapgrid()
+    self.assertTrue(self.grid.processComputerPartitionList())
+
+    self.assertEqual(self.sequence,
+                     ['getFullComputerInformation', 'availableComputerPartition',
+                      'stoppedComputerPartition', 'getFullComputerInformation',
+                      'availableComputerPartition','stoppedComputerPartition',
+                      'getFullComputerInformation'])
+
+  def test_partition_old_timestamp(self):
+
+    self.sequence = []
+    self.timestamp = str(int(time.time()))
+    self.started = False
+    httplib.HTTPConnection._callback = _server_response(self,'stopped',
+                                                             self.timestamp)
+
+    os.mkdir(self.software_root)
+    os.mkdir(self.instance_root)
+    partition_path = os.path.join(self.instance_root, '0')
+    os.mkdir(partition_path, 0750)
+    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
+    srdir = os.path.join(self.software_root, software_hash)
+    os.mkdir(srdir)
+    open(os.path.join(srdir, 'template.cfg'), 'w').write(
+      """[buildout]""")
+    srbindir = os.path.join(srdir, 'bin')
+    os.mkdir(srbindir)
+    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
+touch worked""")
+    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    self.assertTrue(self.grid.processComputerPartitionList())
+    self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
+      'var'])
+    partition = os.path.join(self.instance_root, '0')
+    self.assertSortedListEqual(os.listdir(partition), ['.timestamp','worked',
+      'buildout.cfg'])
+    self.assertSortedListEqual(os.listdir(self.software_root),
+      [software_hash])
+
+    self.setSlapgrid()
+    httplib.HTTPConnection._callback = _server_response(self,
+                                                        'stopped',
+                                                        str(int(self.timestamp)-1))    
+    self.assertTrue(self.grid.processComputerPartitionList())
+    self.assertEqual(self.sequence,
+                     ['getFullComputerInformation', 'availableComputerPartition',
+                      'stoppedComputerPartition', 'getFullComputerInformation'])
+  
+
+
+  def test_partition_timestamp_new_timestamp(self):
+
+    self.sequence = []
+    self.timestamp = str(int(time.time()))
+    self.started = False
+    httplib.HTTPConnection._callback = _server_response(self,
+                                                        'stopped',
+                                                        self.timestamp)
+    os.mkdir(self.software_root)
+    os.mkdir(self.instance_root)
+    partition_path = os.path.join(self.instance_root, '0')
+    os.mkdir(partition_path, 0750)
+    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
+    srdir = os.path.join(self.software_root, software_hash)
+    os.mkdir(srdir)
+    open(os.path.join(srdir, 'template.cfg'), 'w').write(
+      """[buildout]""")
+    srbindir = os.path.join(srdir, 'bin')
+    os.mkdir(srbindir)
+    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
+touch worked""")
+    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    self.assertTrue(self.grid.processComputerPartitionList())
+    self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
+      'var'])
+    partition = os.path.join(self.instance_root, '0')
+    self.assertSortedListEqual(os.listdir(partition), ['.timestamp','worked',
+      'buildout.cfg'])
+    self.assertSortedListEqual(os.listdir(self.software_root),
+      [software_hash])
+    httplib.HTTPConnection._callback = _server_response(self,
+                                                        'stopped',
+                                                        str(int(self.timestamp)+1))
+    self.setSlapgrid()    
+    self.assertTrue(self.grid.processComputerPartitionList())
+    self.setSlapgrid()    
+    self.assertTrue(self.grid.processComputerPartitionList())
+    self.assertEqual(self.sequence,
+                     ['getFullComputerInformation', 'availableComputerPartition',
+                      'stoppedComputerPartition', 'getFullComputerInformation',
+                      'availableComputerPartition','stoppedComputerPartition',
+                      'getFullComputerInformation'])
+
+  def test_partition_timestamp_no_timestamp(self):
+
+    self.sequence = []
+    self.timestamp = str(int(time.time()))
+    self.started = False
+    httplib.HTTPConnection._callback = _server_response(self,
+                                                        'stopped',
+                                                        self.timestamp)
+    os.mkdir(self.software_root)
+    os.mkdir(self.instance_root)
+    partition_path = os.path.join(self.instance_root, '0')
+    os.mkdir(partition_path, 0750)
+    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
+    srdir = os.path.join(self.software_root, software_hash)
+    os.mkdir(srdir)
+    open(os.path.join(srdir, 'template.cfg'), 'w').write(
+      """[buildout]""")
+    srbindir = os.path.join(srdir, 'bin')
+    os.mkdir(srbindir)
+    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
+touch worked""")
+    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    self.assertTrue(self.grid.processComputerPartitionList())
+    self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
+      'var'])
+    partition = os.path.join(self.instance_root, '0')
+    self.assertSortedListEqual(os.listdir(partition), ['.timestamp','worked',
+      'buildout.cfg'])
+    self.assertSortedListEqual(os.listdir(self.software_root),
+      [software_hash])
+    httplib.HTTPConnection._callback = _server_response(self,
+                                                        'stopped')
+    self.setSlapgrid()    
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertEqual(self.sequence,
                      ['getFullComputerInformation', 'availableComputerPartition',
-- 
2.30.9