def get_cloud_service(self): Printer.start_test("Get CloudService") (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s" % ( self.config["subscription_id"], self.config["cloud_service_name"] ), "GET", None, validate_xml=True ) if status in [200, 201]: Printer.success("Get CloudService succeeded.") Printer.info("Checking XML") else: Printer.error("Get CloudService failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) root_node_expected_tag = '{0}CloudService'.format(xmlutil.get_namespace(t)) root_node_actual_tag = xmlutil.get_root_tag(t) if (root_node_expected_tag != root_node_actual_tag): Printer.error("Root node does not have expected tag %s" % root_node_expected_tag) return resource_names = map(lambda t: t.text, xmlutil.get_nodes(t, ".//{0}Resource/{0}Name")) if self.config['resource_name'] not in resource_names: Printer.error("Resource named '%s' not returned by endpoint" % self.config['resource_name'])
def upgrade(self): etag = generate_etag() Printer.start_test("Update plan") # CHECK: Plan upgrade succeeds (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s" % ( self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"]), 'PUT', xmlutil.xml_for_create_resource( plan=self.config['upgrade_plan'], resource_type=self.config['resource_type'], promotion_code=self.config['promo_code'], etag=etag ), validate_xml=True ) if status in [200, 201]: Printer.success("Upgrade Resource succeeded.") Printer.info("Checking XML") else: Printer.error("Upgrade Resource failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) self._validate_resource_response(etag, t) Printer.info("Checking if new plan is %s" % self.config['upgrade_plan']) self._check_node_value(t, './{0}Plan', self.config['upgrade_plan'])
def get_resource(self): Printer.start_test("Get Resource") (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s" % ( self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"], ), "GET", None, validate_xml=True, ) if status in [200, 201]: Printer.success("Get resource succeeded.") Printer.info("Checking XML") else: Printer.error("Get resource failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) self._validate_resource_response(None, t)
def upgrade(self): etag = generate_etag() Printer.start_test("Update plan") # CHECK: Plan upgrade succeeds (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s" % (self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"]), 'PUT', xmlutil.xml_for_create_resource( plan=self.config['upgrade_plan'], resource_type=self.config['resource_type'], promotion_code=self.config['promo_code'], etag=etag), validate_xml=True) if status in [200, 201]: Printer.success("Upgrade Resource succeeded.") Printer.info("Checking XML") else: Printer.error("Upgrade Resource failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) self._validate_resource_response(etag, t) Printer.info("Checking if new plan is %s" % self.config['upgrade_plan']) self._check_node_value(t, './{0}Plan', self.config['upgrade_plan'])
def get_cloud_service(self): Printer.start_test("Get CloudService") (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s" % (self.config["subscription_id"], self.config["cloud_service_name"]), "GET", None, validate_xml=True) if status in [200, 201]: Printer.success("Get CloudService succeeded.") Printer.info("Checking XML") else: Printer.error("Get CloudService failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) root_node_expected_tag = '{0}CloudService'.format( xmlutil.get_namespace(t)) root_node_actual_tag = xmlutil.get_root_tag(t) if (root_node_expected_tag != root_node_actual_tag): Printer.error("Root node does not have expected tag %s" % root_node_expected_tag) return resource_names = map(lambda t: t.text, xmlutil.get_nodes(t, ".//{0}Resource/{0}Name")) if self.config['resource_name'] not in resource_names: Printer.error("Resource named '%s' not returned by endpoint" % self.config['resource_name'])
def perform_request(self, uri, method, body, uri_type='base', validate_xml=True, timeout=20.0): full_url = urlparse.urljoin( self.base_uri, uri) if uri_type == 'base' else urlparse.urljoin( self.sso_uri, uri) dispatch = { 'GET': requests.get, 'PUT': requests.put, 'POST': requests.post, 'DELETE': requests.delete } Printer.info("%s on %s" % (method, full_url)) try: if method in ['PUT', 'POST']: result = dispatch[method](full_url, body, headers=self.headers) elif method in ['GET', 'DELETE']: result = dispatch[method](full_url, headers=self.headers) except requests.exceptions.ConnectionError as e: Printer.error("Could not %s on %s. Error: %s" % (method, full_url, e.message[1])) die() except requests.exceptions.Timeout as e: Printer.error("%s on %s timed out." % (method, full_url)) die() Printer.info("Server returned HTTP status code %s" % result.status_code) if result.content and validate_xml: try: t = xmlutil.get_root_element( xmlutil.get_subtree_from_xml_string(result.content)) except Exception as e: Printer.error( "Could not parse response as XML. Check for mismatched tags or missing XML header. Error: %s" % e.message) die() try: xmlutil.check_tags_alpha_ordered(t) except xmlutil.TagOrderingException as e: Printer.error( "Tags in response have to be alphabetically sorted. These tags are not alphabetically-sorted: %s" % e.message) die() return (result.status_code, result.content)
def create(self): etag = generate_etag() Printer.start_test("Create resource") (status, response) = self.client.perform_request( "subscriptions/%s/Events" % self.config["subscription_id"], "POST", xmlutil.xml_for_subscription_event( self.config["subscription_id"], self.config["resource_provider_namespace"], self.config["resource_type"], "Registered", ), ) # CHECK: Subscription Register event succeeds if status in [200, 201]: Printer.success("Subscription register event succeeded") else: Printer.error("Subscription register event failed with HTTP status code %s" % status) return # CHECK: Resource creation succeeds (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s" % ( self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"], ), "PUT", xmlutil.xml_for_create_resource( plan=self.config["purchase_plan"], resource_type=self.config["resource_type"], promotion_code=self.config["promo_code"], etag=etag, ), ) if status in [200, 201]: Printer.success("Resource creation succeeded") Printer.info("Checking XML") else: Printer.error("Resource creation event failed with HTTP status code %s" % status) t = xmlutil.get_subtree_from_xml_string(response) self._validate_resource_response(etag, t)
def create(self): etag = generate_etag() Printer.start_test("Create resource") (status, response) = self.client.perform_request( "subscriptions/%s/Events" % self.config['subscription_id'], 'POST', xmlutil.xml_for_subscription_event( self.config["subscription_id"], self.config["resource_provider_namespace"], self.config["resource_type"], "Registered")) # CHECK: Subscription Register event succeeds if status in [200, 201]: Printer.success("Subscription register event succeeded") else: Printer.error( "Subscription register event failed with HTTP status code %s" % status) return # CHECK: Resource creation succeeds (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s" % (self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"]), 'PUT', xmlutil.xml_for_create_resource( plan=self.config['purchase_plan'], resource_type=self.config['resource_type'], promotion_code=self.config['promo_code'], etag=etag)) if status in [200, 201]: Printer.success("Resource creation succeeded") Printer.info("Checking XML") else: Printer.error( "Resource creation event failed with HTTP status code %s" % status) t = xmlutil.get_subtree_from_xml_string(response) self._validate_resource_response(etag, t)
def get_resource(self): Printer.start_test("Get Resource") (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s" % (self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"]), "GET", None, validate_xml=True) if status in [200, 201]: Printer.success("Get resource succeeded.") Printer.info("Checking XML") else: Printer.error("Get resource failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) self._validate_resource_response(None, t)
def perform_request(self, uri, method, body, uri_type='base', validate_xml=True, timeout=20.0): full_url = urlparse.urljoin(self.base_uri,uri) if uri_type == 'base' else urlparse.urljoin(self.sso_uri,uri) dispatch = { 'GET': requests.get, 'PUT': requests.put, 'POST': requests.post, 'DELETE': requests.delete } Printer.info("%s on %s" % (method, full_url)) try: if method in ['PUT','POST']: result = dispatch[method](full_url, body, headers=self.headers) elif method in ['GET', 'DELETE']: result = dispatch[method](full_url, headers=self.headers) except requests.exceptions.ConnectionError as e: Printer.error("Could not %s on %s. Error: %s" % (method, full_url, e.message[1])) die() except requests.exceptions.Timeout as e: Printer.error("%s on %s timed out." % (method, full_url)) die() Printer.info("Server returned HTTP status code %s" % result.status_code) if result.content and validate_xml: try: t = xmlutil.get_root_element(xmlutil.get_subtree_from_xml_string(result.content)) except Exception as e: Printer.error("Could not parse response as XML. Check for mismatched tags or missing XML header. Error: %s" % e.message) die() try: xmlutil.check_tags_alpha_ordered(t) except xmlutil.TagOrderingException as e: Printer.error("Tags in response have to be alphabetically sorted. These tags are not alphabetically-sorted: %s" % e.message) die() return (result.status_code, result.content)
def sso(self): Printer.start_test("SSO with valid timestamp and token") (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s/SsoToken" % ( self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"] ), "POST", None, validate_xml=True ) if status in [200, 201]: Printer.success("SSO token request succeeded.") Printer.info("Checking XML") else: Printer.error("SSO token request failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) self._check_node_exists(t, "./{0}SsoToken/TimeStamp") self._check_node_exists(t, "./{0}SsoToken/Token") fragment = urllib.urlencode( { "token": xmlutil.get_node_value(t, "./{0}Token"), "timestamp": xmlutil.get_node_value(t, "./{0}TimeStamp") } ) (status, response) = self.client.perform_request( "?subid=%s&cloudservicename=%s&resourcetype=%s&resourcename=%s&%s" % ( self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"], fragment ), "GET", None, uri_type="sso", validate_xml=False ) if status in [200, 201]: Printer.success("SSO login succeeded.") else: Printer.error("SSO login request failed with HTTP status code %s" % status) return Printer.start_test("SSO with expired timestamp") given_timestamp = iso8601.parse_date(xmlutil.get_node_value(t, "./{0}TimeStamp")) expired_timestamp = given_timestamp + timedelta(seconds=60*10) fragment = urllib.urlencode( { "token": xmlutil.get_node_value(t, "./{0}Token"), "timestamp": str(expired_timestamp) } ) (status, response) = self.client.perform_request( "sso?subid=%s&cloudservicename=%s&resourcetype=%s&resourcename=%s&%s" % ( self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"], fragment ), "GET", None, uri_type="sso", validate_xml=False ) if status in [200, 201]: Printer.error("SSO login with expired timestamp succeeded.") else: Printer.success("SSO login with expired timestamp failed with error code %s" % status) return
def sso(self): Printer.start_test("SSO with valid timestamp and token") (status, response) = self.client.perform_request( "subscriptions/%s/cloudservices/%s/resources/%s/%s/SsoToken" % (self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"]), "POST", None, validate_xml=True) if status in [200, 201]: Printer.success("SSO token request succeeded.") Printer.info("Checking XML") else: Printer.error("SSO token request failed with HTTP status code %s" % status) return t = xmlutil.get_subtree_from_xml_string(response) self._check_node_exists(t, "./{0}SsoToken/TimeStamp") self._check_node_exists(t, "./{0}SsoToken/Token") fragment = urllib.urlencode({ "token": xmlutil.get_node_value(t, "./{0}Token"), "timestamp": xmlutil.get_node_value(t, "./{0}TimeStamp") }) (status, response) = self.client.perform_request( "?subid=%s&cloudservicename=%s&resourcetype=%s&resourcename=%s&%s" % (self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"], fragment), "GET", None, uri_type="sso", validate_xml=False) if status in [200, 201]: Printer.success("SSO login succeeded.") else: Printer.error("SSO login request failed with HTTP status code %s" % status) return Printer.start_test("SSO with expired timestamp") given_timestamp = iso8601.parse_date( xmlutil.get_node_value(t, "./{0}TimeStamp")) expired_timestamp = given_timestamp + timedelta(seconds=60 * 10) fragment = urllib.urlencode({ "token": xmlutil.get_node_value(t, "./{0}Token"), "timestamp": str(expired_timestamp) }) (status, response) = self.client.perform_request( "sso?subid=%s&cloudservicename=%s&resourcetype=%s&resourcename=%s&%s" % (self.config["subscription_id"], self.config["cloud_service_name"], self.config["resource_type"], self.config["resource_name"], fragment), "GET", None, uri_type="sso", validate_xml=False) if status in [200, 201]: Printer.error("SSO login with expired timestamp succeeded.") else: Printer.success( "SSO login with expired timestamp failed with error code %s" % status) return