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'])
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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'])
Ejemplo n.º 5
0
    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'])
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
	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
Ejemplo n.º 12
0
    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