Index: libcloud/base.py
===================================================================
--- libcloud/base.py (revision 929707)
+++ libcloud/base.py (working copy)
@@ -401,12 +401,12 @@
# Extend default headers
headers = self.add_default_headers(headers)
# We always send a content length and user-agent header
- headers.update({'Content-Length': len(data)})
headers.update({'User-Agent': self._user_agent()})
headers.update({'Host': self.host})
# Encode data if necessary
if data != '':
data = self.encode_data(data)
+ headers.update({'Content-Length': len(data)})
url = '?'.join((action, urllib.urlencode(params)))
# Removed terrible hack...this a less-bad hack that doesn't execute a
Index: libcloud/providers.py
===================================================================
--- libcloud/providers.py (revision 929707)
+++ libcloud/providers.py (working copy)
@@ -43,6 +43,8 @@
('libcloud.drivers.voxel', 'VoxelNodeDriver'),
Provider.SOFTLAYER:
('libcloud.drivers.softlayer', 'SoftLayerNodeDriver'),
+ Provider.IBM:
+ ('libcloud.drivers.ibm', 'IBMNodeDriver')
}
def get_driver(provider):
Index: libcloud/types.py
===================================================================
--- libcloud/types.py (revision 929707)
+++ libcloud/types.py (working copy)
@@ -47,6 +47,7 @@
EC2_US_WEST = 10
VOXEL = 11
SOFTLAYER = 12
+ IBM = 13
class NodeState(object):
"""
Index: libcloud/drivers/ibm.py
===================================================================
--- libcloud/drivers/ibm.py (revision 0)
+++ libcloud/drivers/ibm.py (revision 0)
@@ -0,0 +1,174 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# libcloud.org licenses this file to You 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.
+# Copyright 2009 RedRata Ltd
+"""
+Driver for the IBM Developer Cloud.
+"""
+from libcloud.types import NodeState, InvalidCredsException, Provider
+from libcloud.base import Response, ConnectionUserAndKey, NodeDriver, Node, NodeImage, NodeSize, NodeLocation
+import base64, urllib
+
+from xml.etree import ElementTree as ET
+
+HOST = 'www-180.ibm.com'
+REST_BASE = '/cloud/enterprise/beta/api/rest/20090403/'
+
+class IBMResponse(Response):
+ def success(self):
+ return int(self.status) == 200
+
+ def parse_body(self):
+ if not self.body:
+ return None
+ return ET.XML(self.body)
+
+ def parse_error(self):
+ if int(self.status) == 401:
+ raise InvalidCredsException(self.error)
+ return self.body
+
+class IBMConnection(ConnectionUserAndKey):
+ """
+ Handles the connection to the IBM Developer Cloud.
+ """
+ host = HOST
+ responseCls = IBMResponse
+
+ def add_default_headers(self, headers):
+ headers['Accept'] = 'text/xml'
+ headers['Authorization'] = ('Basic %s' % (base64.b64encode('%s:%s' % (self.user_id, self.key))))
+ if not 'Content-Type' in headers:
+ headers['Content-Type'] = 'text/xml'
+ return headers
+
+ def encode_data(self, data):
+ return urllib.urlencode(data)
+
+class IBMNodeDriver(NodeDriver):
+ """
+ IBM Developer Cloud node driver.
+ """
+ connectionCls = IBMConnection
+ type = Provider.IBM
+ name = "IBM Developer Cloud"
+
+ NODE_STATE_MAP = { 0: NodeState.PENDING,
+ 1: NodeState.PENDING,
+ 2: NodeState.TERMINATED,
+ 3: NodeState.TERMINATED,
+ 4: NodeState.TERMINATED,
+ 5: NodeState.RUNNING,
+ 6: NodeState.UNKNOWN,
+ 7: NodeState.PENDING,
+ 8: NodeState.REBOOTING,
+ 9: NodeState.PENDING,
+ 10: NodeState.PENDING,
+ 11: NodeState.TERMINATED }
+
+ def create_node(self, **kwargs):
+ """
+ Creates a node in the IBM Developer Cloud.
+
+ See L{NodeDriver.create_node} for more keyword args.
+ @keyword publicKey: Specifies the public key for the node
+ @type publicKey: String
+
+ @keyword configurationData: Image-specific configuration parameters
+ @type configurationData: C{dict}
+ """
+
+ # Compose headers for message body
+ data = {}
+ data.update({'name': kwargs['name']})
+ data.update({'imageID': kwargs['image'].id})
+ data.update({'instanceType': kwargs['size'].id})
+ if 'location' in kwargs:
+ data.update({'location': kwargs['location'].id})
+ else:
+ data.update({'location': '1'})
+ if 'publicKey' in kwargs:
+ data.update({'publicKey': kwargs['publicKey']})
+ if 'configurationData' in kwargs:
+ configurationData = kwargs['configurationData']
+ for key in configurationData.keys():
+ data.update({key: configurationData.get(key)})
+
+ # Send request!
+ resp = self.connection.request(action = REST_BASE + 'instances',
+ headers = {'Content-Type': 'application/x-www-form-urlencoded'},
+ method = 'POST',
+ data = data).object
+ return self._to_nodes(resp)[0]
+
+ def destroy_node(self, node):
+ url = REST_BASE + 'instances/%s' % (node.id)
+ status = int(self.connection.request(action = url, method='DELETE').status)
+ return status == 200
+
+ def reboot_node(self, node):
+ url = REST_BASE + 'instances/%s' % (node.id)
+ headers = {'Content-Type': 'application/x-www-form-urlencoded'}
+ data = {'state': 'restart'}
+
+ resp = self.connection.request(action = url,
+ method = 'PUT',
+ headers = headers,
+ data = data)
+ return int(resp.status) == 200
+
+ def list_nodes(self):
+ return self._to_nodes(self.connection.request(REST_BASE + 'instances').object)
+
+ def list_images(self, location = None):
+ return self._to_images(self.connection.request(REST_BASE + 'images').object)
+
+ def list_sizes(self, location = None):
+ # IBM Developer Cloud instances currently support SMALL, MEDIUM, and
+ # LARGE. Storage also supports SMALL, MEDIUM, and LARGE.
+ return [ NodeSize('SMALL', 'SMALL', None, None, None, None, self.connection.driver),
+ NodeSize('MEDIUM', 'MEDIUM', None, None, None, None, self.connection.driver),
+ NodeSize('LARGE', 'LARGE', None, None, None, None, self.connection.driver) ]
+
+ def list_locations(self):
+ return self._to_locations(self.connection.request(REST_BASE + 'locations').object)
+
+ def _to_nodes(self, object):
+ return [ self._to_node(instance) for instance in object.findall('Instance') ]
+
+ def _to_node(self, instance):
+ return Node(id = instance.findtext('ID'),
+ name = instance.findtext('Name'),
+ state = self.NODE_STATE_MAP[int(instance.findtext('Status'))],
+ public_ip = instance.findtext('IP'),
+ private_ip = None,
+ driver = self.connection.driver)
+
+ def _to_images(self, object):
+ return [ self._to_image(image) for image in object.findall('Image') ]
+
+ def _to_image(self, image):
+ return NodeImage(id = image.findtext('ID'),
+ name = image.findtext('Name'),
+ driver = self.connection.driver)
+
+ def _to_locations(self, object):
+ return [ self._to_location(location) for location in object.findall('Location') ]
+
+ def _to_location(self, location):
+ # NOTE: country currently hardcoded
+ return NodeLocation(id = location.findtext('ID'),
+ name = location.findtext('Name'),
+ country = 'USA',
+ driver = self.connection.driver)
Index: test/__init__.py
===================================================================
--- test/__init__.py (revision 929707)
+++ test/__init__.py (working copy)
@@ -175,7 +175,7 @@
self.assertTrue(isinstance(image, NodeImage))
- def test_list_images_response(self):
+ def test_list_locations_response(self):
locations = self.driver.list_locations()
self.assertTrue(isinstance(locations, list))
for dc in locations:
Index: test/test_ibm.py
===================================================================
--- test/test_ibm.py (revision 0)
+++ test/test_ibm.py (revision 0)
@@ -0,0 +1,204 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# libcloud.org licenses this file to You 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
+import unittest
+import httplib
+
+from test.file_fixtures import FileFixtures
+from libcloud.types import InvalidCredsException
+from libcloud.drivers.ibm import IBMNodeDriver as IBM
+from libcloud.base import Node, NodeImage, NodeSize
+from test import MockHttp, TestCaseMixin
+from secrets import IBM_USER, IBM_SECRET
+from libcloud.base import NodeImage, NodeSize, NodeLocation
+
+class IBMTests(unittest.TestCase, TestCaseMixin):
+ """
+ Tests the IBM Developer Cloud driver.
+ """
+
+ def setUp(self):
+ IBM.connectionCls.conn_classes = (None, IBMMockHttp)
+ IBMMockHttp.type = None
+ self.driver = IBM(IBM_USER, IBM_SECRET)
+
+ def test_auth(self):
+ IBMMockHttp.type = 'UNAUTHORIZED'
+
+ try:
+ self.driver.list_nodes()
+ except InvalidCredsException, e:
+ self.assertTrue(isinstance(e, InvalidCredsException))
+ self.assertEquals(e.value, 'Unauthorized')
+ else:
+ self.fail('test should have thrown')
+
+ def test_list_nodes(self):
+ ret = self.driver.list_nodes()
+ self.assertEquals(len(ret), 3)
+ self.assertEquals(ret[0].id, '26557')
+ self.assertEquals(ret[0].name, 'Insight Instance')
+ self.assertEquals(ret[0].public_ip, '129.33.196.128')
+ self.assertEquals(ret[0].private_ip, None) # Private IPs not supported
+ self.assertEquals(ret[1].public_ip, None) # Node is non-active (no IP)
+ self.assertEquals(ret[1].private_ip, None)
+ self.assertEquals(ret[1].id, '28193')
+
+ def test_list_sizes(self):
+ ret = self.driver.list_sizes()
+ self.assertEquals(len(ret), 3) # 3 instance configurations supported
+ self.assertEquals(ret[0].id, 'SMALL')
+ self.assertEquals(ret[1].id, 'MEDIUM')
+ self.assertEquals(ret[2].id, 'LARGE')
+ self.assertEquals(ret[0].name, 'SMALL')
+ self.assertEquals(ret[0].disk, None)
+
+ def test_list_images(self):
+ ret = self.driver.list_images()
+ self.assertEqual(len(ret), 21)
+ self.assertEqual(ret[10].name, "Rational Asset Manager 7.2.0.1")
+ self.assertEqual(ret[9].id, '10002573')
+
+ def test_list_locations(self):
+ ret = self.driver.list_locations()
+ self.assertEquals(len(ret), 1)
+ self.assertEquals(ret[0].id, '1')
+ self.assertEquals(ret[0].name, 'US North East: Poughkeepsie, NY')
+ self.assertEquals(ret[0].country, 'USA')
+
+ def test_create_node(self):
+ # Test creation of node
+ IBMMockHttp.type = 'CREATE'
+ image = NodeImage(id=11, name='Rational Insight', driver=self.driver)
+ size = NodeSize('LARGE', 'LARGE', None, None, None, None, self.driver)
+ location = NodeLocation('1', 'POK', 'USA', driver=self.driver)
+ ret = self.driver.create_node(name='RationalInsight4',
+ image=image,
+ size=size,
+ location=location,
+ publicKey='MyPublicKey',
+ configurationData = {
+ 'insight_admin_password': 'myPassword1',
+ 'db2_admin_password': 'myPassword2',
+ 'report_user_password': 'myPassword3'})
+ self.assertTrue(isinstance(ret, Node))
+ self.assertEquals(ret.name, 'RationalInsight4')
+
+ # Test creation attempt with invalid location
+ IBMMockHttp.type = 'CREATE_INVALID'
+ location = NodeLocation('3', 'DOESNOTEXIST', 'USA', driver=self.driver)
+ try:
+ ret = self.driver.create_node(name='RationalInsight5',
+ image=image,
+ size=size,
+ location=location,
+ publicKey='MyPublicKey',
+ configurationData = {
+ 'insight_admin_password': 'myPassword1',
+ 'db2_admin_password': 'myPassword2',
+ 'report_user_password': 'myPassword3'})
+ except Exception, e:
+ self.assertEquals(e.args[0], 'Error 412: No DataCenter with id: 3')
+ else:
+ self.fail('test should have thrown')
+
+ def test_destroy_node(self):
+ # Delete existant node
+ nodes = self.driver.list_nodes() # retrieves 3 nodes
+ self.assertEquals(len(nodes), 3)
+ IBMMockHttp.type = 'DELETE'
+ toDelete = nodes[1]
+ ret = self.driver.destroy_node(toDelete)
+ self.assertTrue(ret)
+
+ # Delete non-existant node
+ IBMMockHttp.type = 'DELETED'
+ nodes = self.driver.list_nodes() # retrieves 2 nodes
+ self.assertEquals(len(nodes), 2)
+ try:
+ self.driver.destroy_node(toDelete) # delete non-existent node
+ except Exception, e:
+ self.assertEquals(e.args[0], 'Error 404: Invalid Instance ID 28193')
+ else:
+ self.fail('test should have thrown')
+
+ def test_reboot_node(self):
+ nodes = self.driver.list_nodes()
+ IBMMockHttp.type = 'REBOOT'
+
+ # Reboot active node
+ self.assertEquals(len(nodes), 3)
+ ret = self.driver.reboot_node(nodes[0])
+ self.assertTrue(ret)
+
+ # Reboot inactive node
+ try:
+ ret = self.driver.reboot_node(nodes[1])
+ except Exception, e:
+ self.assertEquals(e.args[0], 'Error 412: Instance must be in the Active state')
+ else:
+ self.fail('test should have thrown')
+
+class IBMMockHttp(MockHttp):
+ fixtures = FileFixtures('ibm')
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances(self, method, url, body, headers):
+ body = self.fixtures.load('instances.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_DELETED(self, method, url, body, headers):
+ body = self.fixtures.load('instances_deleted.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_UNAUTHORIZED(self, method, url, body, headers):
+ return (httplib.UNAUTHORIZED, body, {}, httplib.responses[httplib.UNAUTHORIZED])
+
+ def _cloud_enterprise_beta_api_rest_20090403_images(self, method, url, body, headers):
+ body = self.fixtures.load('images.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _cloud_enterprise_beta_api_rest_20090403_locations(self, method, url, body, headers):
+ body = self.fixtures.load('locations.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_26557_REBOOT(self, method, url, body, headers):
+ body = self.fixtures.load('reboot_active.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_28193_REBOOT(self, method, url, body, headers):
+ return (412, 'Error 412: Instance must be in the Active state', {}, 'Precondition Failed')
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_28193_DELETE(self, method, url, body, headers):
+ body = self.fixtures.load('delete.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_28193_DELETED(self, method, url, body, headers):
+ return (404, 'Error 404: Invalid Instance ID 28193', {}, 'Precondition Failed')
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_CREATE(self, method, url, body, headers):
+ body = self.fixtures.load('create.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+ def _cloud_enterprise_beta_api_rest_20090403_instances_CREATE_INVALID(self, method, url, body, headers):
+ return (412, 'Error 412: No DataCenter with id: 3', {}, 'Precondition Failed')
+
+ # This is only to accomodate the response tests built into test\__init__.py
+ def _cloud_enterprise_beta_api_rest_20090403_instances_26557(self, method, url, body, headers):
+ if method == 'DELETE':
+ body = self.fixtures.load('delete.xml')
+ else:
+ body = self.fixtures.load('reboot_active.xml')
+ return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+if __name__ == '__main__':
+ sys.exit(unittest.main())
\ No newline at end of file
Index: test/fixtures/ibm/create.xml
===================================================================
--- test/fixtures/ibm/create.xml (revision 0)
+++ test/fixtures/ibm/create.xml (revision 0)
@@ -0,0 +1 @@
+28558128558RationalInsight4woodser@us.ibm.com11LARGEMyPublicKey02010-04-19T10:03:34.327-04:002010-04-26T10:03:43.610-04:00SUSE Linux Enterprise10 SP2OS
Index: test/fixtures/ibm/delete.xml
===================================================================
--- test/fixtures/ibm/delete.xml (revision 0)
+++ test/fixtures/ibm/delete.xml (revision 0)
@@ -0,0 +1 @@
+
Index: test/fixtures/ibm/images.xml
===================================================================
--- test/fixtures/ibm/images.xml (revision 0)
+++ test/fixtures/ibm/images.xml (revision 0)
@@ -0,0 +1,2 @@
+
+2fd2d0478b132490897526b9b4433a334Rational Build Forge Agent11SYSTEMPUBLICi386SUSE Linux Enterprise/10 SP2Rational Build Forge provides an adaptive process execution framework that automates, orchestrates, manages, and tracks all the processes between each handoff within the assembly line of software development, creating an automated software factory.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{A233F5A0-05A5-F21D-3E92-3793B722DFBD}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{A233F5A0-05A5-F21D-3E92-3793B722DFBD}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-04-25T00:00:00.000-04:00384e900960c3d4b648fa6d4670aed2cd1SUSE 10 SP211SYSTEMPUBLICi386SUSE Linux Enterprise/10 SP2SuSE v10.2 Base OS Imagehttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{07F112A1-84A7-72BF-B8FD-B36011E0E433}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{07F112A1-84A7-72BF-B8FD-B36011E0E433}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-04-25T00:00:00.000-04:0015a72d3e7bb1cb4942ab0da2968e2e77bbWebSphere Application Server and Rational Agent Controller11SYSTEMPUBLICi386SUSE Linux Enterprise/10 SP2WebSphere Application Server and Rational Agent Controller enables a performance based foundation to build, reuse, run, integrate and manage Service Oriented Architecture (SOA) applications and services.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{86E8E71D-29A3-86DE-8A26-792C5E839D92}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{86E8E71D-29A3-86DE-8A26-792C5E839D92}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-04-25T00:00:00.000-04:00117da905ba0fdf4d8b8f94e7f4ef43c1beRational Insight11SYSTEMPUBLICi386SUSE Linux Enterprise/10 SP2Rational Insight helps organizations reduce time to market, improve quality, and take greater control of software and systems development and delivery. It provides objective dashboards and best practice metrics to identify risks, status, and trends.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{4F774DCF-1469-EAAB-FBC3-64AE241CF8E8}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{4F774DCF-1469-EAAB-FBC3-64AE241CF8E8}/1.0/GettingStarted.htmlLARGE2009-04-25T00:00:00.000-04:0018edf7ad43f75943b1b0c0f915dba8d86cDB2 Express-C11SYSTEMPUBLICi386SUSE Linux Enterprise/10 SP2DB2 Express-C is an entry-level edition of the DB2 database server for the developer community. It has standard relational functionality and includes pureXML, and other features of DB2 for Linux, Unix, and Windows (LUW).https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{E69488DE-FB79-63CD-E51E-79505A1309BD}/2.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{E69488DE-FB79-63CD-E51E-79505A1309BD}/2.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-04-25T00:00:00.000-04:0021c03be6800bf043c0b44c584545e04099Informix Dynamic Server Developer Edition11SYSTEMPUBLICi386SUSE Linux Enterprise/10 SP2Informix Dynamic Server (IDS) Developer Edition is a development version of the IDS Enterprise Edition. IDS is designed to meet the database server needs of small-size to large-size enterprise businesses.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{9B0C8F66-9639-CA0A-0A94-7928D7DAD6CB}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{9B0C8F66-9639-CA0A-0A94-7928D7DAD6CB}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-04-25T00:00:00.000-04:00229b2b6482ba374a6ab4bb3585414a910aWebSphere sMash with AppBuilder11SYSTEMPUBLICi386SUSE Linux Enterprise/10 SP2WebSphere sMash® provides a web platform that includes support for dynamic scripting in PHP and Groovy.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{88E74AC6-9CCB-2710-7E9B-936DA2CE496C}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{88E74AC6-9CCB-2710-7E9B-936DA2CE496C}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-04-25T00:00:00.000-04:001000150416662e71fae44bdba4d7bb502a09c5e7DB2 Enterprise V9.7 (32-bit, 90-day trial)11leonsp@ca.ibm.comPUBLICi386SuSE v10.2DB2 Enterprise V9.7 (32-bit, 90-day trial)https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{38F2AB86-9F03-E463-024D-A9ABC3AE3831}/2.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{38F2AB86-9F03-E463-024D-A9ABC3AE3831}/2.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-11-09T17:01:28.000-05:00100020639da8863714964624b8b13631642c785bRHEL 5.4 Base OS11youngdj@us.ibm.comPUBLICi386Redhat Enterprise Linux (32-bit)/5.4Red Hat Enterprise Linux 5.4 Base OShttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{34904879-E794-A2D8-2D7C-2E8D6AD6AE77}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{34904879-E794-A2D8-2D7C-2E8D6AD6AE77}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2009-11-18T13:51:12.000-05:0010002573e5f09a64667e4faeaf3ac661600ec6caRational Build Forge11leighw@us.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2Rational Build Forge provides an adaptive process execution framework that automates, orchestrates, manages, and tracks all the processes between each handoff within the assembly line of software development, creating an automated software factory.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{22E039C6-108E-B626-ECC9-E2C9B62479FF}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{22E039C6-108E-B626-ECC9-E2C9B62479FF}/1.0/GettingStarted.htmlMEDIUMLARGE2009-12-08T16:34:37.000-05:00100030563e276d758ed842caafe77770d60dedeaRational Asset Manager 7.2.0.111gmendel@us.ibm.comPUBLICi386Redhat Enterprise Linux (32-bit)/5.4Rational Asset Manager helps to create, modify, govern, find and reuse development assets, including SOA and systems development assets. It facilitates the reuse of all types of software development related assets, potentially saving development time.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{296C6DDF-B87B-327B-3E5A-F2C50C353A69}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{296C6DDF-B87B-327B-3E5A-F2C50C353A69}/1.0/GettingStarted.htmlMEDIUMLARGE2009-12-14T14:30:57.000-05:0010003854e3067f999edf4914932295cfb5f79d59WebSphere Portal/WCM 6.1.511mlamb@us.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2IBM® WebSphere® Portal Server enables you to quickly consolidate applications and content into role-based applications, complete with search, personalization, and security capabilities.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{279F3E12-A7EF-0768-135B-F08B66DF8F71}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{279F3E12-A7EF-0768-135B-F08B66DF8F71}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2010-01-12T18:06:29.000-05:00100038640112efd8f1e144998f2a70a165d00bd3Rational Quality Manager11brownms@gmail.comPUBLICi386Redhat Enterprise Linux (32-bit)/5.4Rational Quality Manager provides a collaborative application lifecycle management (ALM) environment for test planning, construction, and execution.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{9DA927BA-2CEF-1686-71B0-2BAC468B7445}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{9DA927BA-2CEF-1686-71B0-2BAC468B7445}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2010-01-15T09:40:12.000-05:00100038653fbf6936e5cb42b5959ad9837add054fIBM Mashup Center with IBM Lotus Widget Factory11mgilmore@us.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2IBM Mashup Center is an end-to-end enterprise mashup platform, supporting rapid assembly of dynamic web applications with the management, security, and governance capabilities.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{0F867D03-588B-BA51-4E18-4CE9D11AECFC}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{0F867D03-588B-BA51-4E18-4CE9D11AECFC}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2010-01-15T10:44:24.000-05:0010003780425e2dfef95647498561f98c4de356abRational Team Concert11sonia_dimitrov@ca.ibm.comPUBLICi386Redhat Enterprise Linux (32-bit)/5.4Rational Team Concert is a collaborative software delivery environment that empowers project teams to simplify, automate and govern software delivery.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{679CA6F5-1E8E-267B-0C84-F7B0B41DF1DC}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{679CA6F5-1E8E-267B-0C84-F7B0B41DF1DC}/1.0/GettingStarted.htmlMEDIUMLARGE2010-01-19T14:13:58.000-05:0010003785c4867b72f2fc43fe982e76c76c32efaaLotus Forms Turbo 3.5.111rlintern@ca.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2Lotus Forms Turbo requires no training and is designed to help customers address basic form software requirements such as surveys, applications, feedback, orders, request for submission, and more - without involvement from the IT department.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{846AD7D3-9A0F-E02C-89D2-BE250CAE2318}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{846AD7D3-9A0F-E02C-89D2-BE250CAE2318}/1.0/GettingStarted.htmlLARGE2010-01-22T13:27:08.000-05:0010005598Rational Requirements Composer11mutdosch@us.ibm.comPUBLICi386Redhat Enterprise Linux (32-bit)/5.4Rational Requirements Composer helps teams define and use requirements effectively across the project lifecycle.https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{28C7B870-2C0A-003F-F886-B89F5B413B77}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{28C7B870-2C0A-003F-F886-B89F5B413B77}/1.0/GettingStarted.htmlMEDIUMLARGE2010-02-08T11:43:18.000-05:0010007509Rational Software Architecture11danberg@us.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2Rational Software Architect for WebSphere with the Cloud Client plug-ins created on 2/22/10 8:06 PMhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{2C6FB6D2-CB87-C4A0-CDE0-5AAF03E214B2}/1.1/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{2C6FB6D2-CB87-C4A0-CDE0-5AAF03E214B2}/1.1/GettingStarted.htmlLARGE2010-02-22T20:03:18.000-05:0010008319WebSphere Feature Pack for OSGi Apps and JPA 2.011radavenp@us.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2IBM WebSphere Application Server V7.0 Fix Pack 7, Feature Pack for OSGi Applications and Java Persistence API 2.0 Open Beta, and Feature Pack for Service Component Architecture (SCA) V1.0.1 Fix Pack V1.0.1.1https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{A397B7CD-A1C7-1956-7AEF-6AB495E37958}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{A397B7CD-A1C7-1956-7AEF-6AB495E37958}/1.0/GettingStarted.htmlSMALLMEDIUMLARGE2010-03-14T21:06:38.000-04:0010008273Rational Software Architect for WebSphere11danberg@us.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2Rational Software Architect for WebSphere with the Cloud Client plug-ins created on 3/15/10 12:21 PMhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{839D92BB-DEA5-9820-8E2E-AE5D0A6DEAE3}/1.1/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{839D92BB-DEA5-9820-8E2E-AE5D0A6DEAE3}/1.1/GettingStarted.htmlLARGE2010-03-15T12:17:26.000-04:0010008404Rational Application Developer11khiamt@ca.ibm.comPUBLICi386SUSE Linux Enterprise/10 SP2An Eclipse-based IDE with visual development features that helps Java developers rapidly design, develop, assemble, test, profile and deploy high quality Java/J2EE, Portal, Web/Web 2.0, Web services and SOA applications. (03/16/2010)https://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{6A957586-A17A-4927-7C71-0FDE280DB66B}/1.0/parameters.xmlhttps://www-180.ibm.com/cloud/enterprise/beta/ram.ws/RAMSecure/artifact/{6A957586-A17A-4927-7C71-0FDE280DB66B}/1.0/GettingStarted.htmlMEDIUMLARGE2010-03-16T00:10:30.000-04:00
\ No newline at end of file
Index: test/fixtures/ibm/instances.xml
===================================================================
--- test/fixtures/ibm/instances.xml (revision 0)
+++ test/fixtures/ibm/instances.xml (revision 0)
@@ -0,0 +1 @@
+26557126557Insight Instancewoodser@us.ibm.com11LARGEPublic keyvm519.developer.ihost.com129.33.196.12852010-04-06T15:40:24.745-04:002010-04-19T04:00:00.000-04:00SUSE Linux Enterprise10 SP2OS28193128193RAD instancewoodser@us.ibm.com10008404MEDIUMasdff22010-04-15T15:20:10.317-04:002010-04-22T15:20:19.564-04:00SUSE Linux Enterprise10 SP2OS28194128194RSAwoodser@us.ibm.com10007509LARGEasdff22010-04-15T15:23:04.753-04:002010-04-22T15:23:13.658-04:00SUSE Linux Enterprise10 SP2OS
\ No newline at end of file
Index: test/fixtures/ibm/instances_deleted.xml
===================================================================
--- test/fixtures/ibm/instances_deleted.xml (revision 0)
+++ test/fixtures/ibm/instances_deleted.xml (revision 0)
@@ -0,0 +1 @@
+26557126557Insight Instancewoodser@us.ibm.com11LARGEPublic keyvm519.developer.ihost.com129.33.196.12852010-04-06T15:40:24.745-04:002010-04-19T04:00:00.000-04:00SUSE Linux Enterprise10 SP2OS28194128194RSAwoodser@us.ibm.com10007509LARGEasdff22010-04-15T15:23:04.753-04:002010-04-22T15:23:13.658-04:00SUSE Linux Enterprise10 SP2OS
\ No newline at end of file
Index: test/fixtures/ibm/locations.xml
===================================================================
--- test/fixtures/ibm/locations.xml (revision 0)
+++ test/fixtures/ibm/locations.xml (revision 0)
@@ -0,0 +1 @@
+1US North East: Poughkeepsie, NYPOK50100200ext3SMALLMEDIUMLARGE
\ No newline at end of file
Index: test/fixtures/ibm/reboot_active.xml
===================================================================
--- test/fixtures/ibm/reboot_active.xml (revision 0)
+++ test/fixtures/ibm/reboot_active.xml (revision 0)
@@ -0,0 +1 @@
+
Index: test/fixtures/ibm/sizes.xml
===================================================================
--- test/fixtures/ibm/sizes.xml (revision 0)
+++ test/fixtures/ibm/sizes.xml (revision 0)
@@ -0,0 +1 @@
+