| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | import base | 
					
						
							|  |  |  | import swagger_client | 
					
						
							|  |  |  | from docker_api import DockerAPI | 
					
						
							| 
									
										
										
										
											2019-04-11 15:05:46 +08:00
										 |  |  | from swagger_client.rest import ApiException | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 11:34:11 +08:00
										 |  |  | def pull_harbor_image(registry, username, password, image, tag, expected_login_error_message = None, expected_error_message = None): | 
					
						
							| 
									
										
										
										
											2018-11-21 12:19:28 +08:00
										 |  |  |     _docker_api = DockerAPI() | 
					
						
							| 
									
										
										
										
											2019-05-06 11:34:11 +08:00
										 |  |  |     _docker_api.docker_login(registry, username, password, expected_error_message = expected_login_error_message) | 
					
						
							|  |  |  |     if expected_login_error_message != None: | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2018-11-21 12:19:28 +08:00
										 |  |  |     time.sleep(2) | 
					
						
							|  |  |  |     _docker_api.docker_image_pull(r'{}/{}'.format(registry, image), tag = tag, expected_error_message = expected_error_message) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 11:34:11 +08:00
										 |  |  | def push_image_to_project(project_name, registry, username, password, image, tag, expected_login_error_message = None, expected_error_message = None): | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  |     _docker_api = DockerAPI() | 
					
						
							| 
									
										
										
										
											2019-05-06 11:34:11 +08:00
										 |  |  |     _docker_api.docker_login(registry, username, password, expected_error_message = expected_login_error_message) | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  |     time.sleep(2) | 
					
						
							| 
									
										
										
										
											2019-05-06 11:34:11 +08:00
										 |  |  |     if expected_login_error_message != None: | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2018-11-21 12:19:28 +08:00
										 |  |  |     _docker_api.docker_image_pull(image, tag = tag) | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  |     time.sleep(2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-27 19:17:41 +08:00
										 |  |  |     new_harbor_registry, new_tag = _docker_api.docker_image_tag(r'{}:{}'.format(image, tag), r'{}/{}/{}'.format(registry, project_name, image)) | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  |     time.sleep(2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 13:47:16 +08:00
										 |  |  |     _docker_api.docker_image_push(new_harbor_registry, new_tag, expected_error_message = expected_error_message) | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return r'{}/{}'.format(project_name, image), new_tag | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-21 12:19:28 +08:00
										 |  |  | def is_repo_exist_in_project(repositories, repo_name): | 
					
						
							|  |  |  |     result = False | 
					
						
							|  |  |  |     for reop in repositories: | 
					
						
							|  |  |  |         if reop.name == repo_name: | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  |     return result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  | class Repository(base.Base): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def list_tags(self, repository, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							| 
									
										
										
										
											2018-11-13 12:53:46 +08:00
										 |  |  |         return client.repositories_repo_name_tags_get(repository) | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-15 15:18:35 +08:00
										 |  |  |     def get_tag(self, repo_name, tag, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							|  |  |  |         return client.repositories_repo_name_tags_tag_get(repo_name, tag) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 18:26:04 +08:00
										 |  |  |     def image_exists(self, repository, tag, **kwargs): | 
					
						
							|  |  |  |         tags = self.list_tags(repository, **kwargs) | 
					
						
							|  |  |  |         exist = False | 
					
						
							|  |  |  |         for t in tags: | 
					
						
							|  |  |  |             if t.name == tag: | 
					
						
							|  |  |  |                 exist = True | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |         return exist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def image_should_exist(self, repository, tag, **kwargs): | 
					
						
							|  |  |  |         if not self.image_exists(repository, tag, **kwargs): | 
					
						
							|  |  |  |             raise Exception("image %s:%s not exist" % (repository, tag)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def image_should_not_exist(self, repository, tag, **kwargs): | 
					
						
							|  |  |  |         if self.image_exists(repository, tag, **kwargs): | 
					
						
							|  |  |  |             raise Exception("image %s:%s exists" % (repository, tag)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def delete_repoitory(self, repo_name, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							|  |  |  |         _, status_code, _ = client.repositories_repo_name_delete_with_http_info(repo_name) | 
					
						
							|  |  |  |         base._assert_status_code(200, status_code) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_repository(self, project_id, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							|  |  |  |         data, status_code, _ = client.repositories_get_with_http_info(project_id) | 
					
						
							|  |  |  |         base._assert_status_code(200, status_code) | 
					
						
							|  |  |  |         return data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def add_label_to_tag(self, repo_name, tag, label_id, expect_status_code = 200, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							|  |  |  |         label = swagger_client.Label(id=label_id) | 
					
						
							|  |  |  |         _, status_code, _ = client.repositories_repo_name_tags_tag_labels_post_with_http_info(repo_name, tag, label) | 
					
						
							|  |  |  |         base._assert_status_code(expect_status_code, status_code) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 16:06:44 +08:00
										 |  |  |     def get_repo_signatures(self, repo_name, expect_status_code = 200, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							|  |  |  |         data, status_code, _ = client.repositories_repo_name_signatures_get_with_http_info(repo_name) | 
					
						
							|  |  |  |         base._assert_status_code(expect_status_code, status_code) | 
					
						
							| 
									
										
										
										
											2018-11-07 16:23:04 +08:00
										 |  |  |         return data | 
					
						
							| 
									
										
										
										
											2018-11-15 15:18:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-03 17:05:06 +08:00
										 |  |  |     def check_image_not_scanned(self, repo_name, tag, **kwargs): | 
					
						
							| 
									
										
										
										
											2018-11-15 15:18:35 +08:00
										 |  |  |         tag = self.get_tag(repo_name, tag, **kwargs) | 
					
						
							|  |  |  |         if tag.scan_overview != None: | 
					
						
							|  |  |  |             raise Exception("Image should be <Not Scanned> state!") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def check_image_scan_result(self, repo_name, tag, expected_scan_status = "finished", **kwargs): | 
					
						
							| 
									
										
										
										
											2018-12-18 10:21:03 +08:00
										 |  |  |         timeout_count = 30 | 
					
						
							| 
									
										
										
										
											2018-12-03 17:05:06 +08:00
										 |  |  |         while True: | 
					
						
							| 
									
										
										
										
											2018-11-15 15:18:35 +08:00
										 |  |  |             time.sleep(5) | 
					
						
							| 
									
										
										
										
											2018-12-03 17:05:06 +08:00
										 |  |  |             timeout_count = timeout_count - 1 | 
					
						
							|  |  |  |             if (timeout_count == 0): | 
					
						
							| 
									
										
										
										
											2019-04-11 15:05:46 +08:00
										 |  |  |                 break | 
					
						
							| 
									
										
										
										
											2018-11-15 15:18:35 +08:00
										 |  |  |             _tag = self.get_tag(repo_name, tag, **kwargs) | 
					
						
							|  |  |  |             if _tag.name == tag and _tag.scan_overview !=None: | 
					
						
							|  |  |  |                 if _tag.scan_overview.scan_status == expected_scan_status: | 
					
						
							| 
									
										
										
										
											2018-12-03 17:05:06 +08:00
										 |  |  |                     return | 
					
						
							|  |  |  |         raise Exception("Scan image result is not as expected {}.".format(expected_scan_status)) | 
					
						
							| 
									
										
										
										
											2018-11-15 15:18:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def scan_image(self, repo_name, tag, expect_status_code = 200, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							|  |  |  |         data, status_code, _ = client.repositories_repo_name_tags_tag_scan_post_with_http_info(repo_name, tag) | 
					
						
							|  |  |  |         base._assert_status_code(expect_status_code, status_code) | 
					
						
							|  |  |  |         return data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-21 12:19:28 +08:00
										 |  |  |     def repository_should_exist(self, project_id, repo_name, **kwargs): | 
					
						
							|  |  |  |         repositories = self.get_repository(project_id, **kwargs) | 
					
						
							|  |  |  |         if is_repo_exist_in_project(repositories, repo_name) == False: | 
					
						
							|  |  |  |             raise Exception("Repository {} is not exist.".format(repo_name)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-29 18:27:53 +08:00
										 |  |  |     def signature_should_exist(self, repo_name, tag, **kwargs): | 
					
						
							|  |  |  |         signatures = self.get_repo_signatures(repo_name, **kwargs) | 
					
						
							|  |  |  |         for each_sign in signatures: | 
					
						
							|  |  |  |             if each_sign.tag == tag and len(each_sign.hashes["sha256"]) == 44: | 
					
						
							|  |  |  |                 print "sha256:", len(each_sign.hashes["sha256"]) | 
					
						
							|  |  |  |                 return | 
					
						
							| 
									
										
										
										
											2019-04-11 15:05:46 +08:00
										 |  |  |         raise Exception(r"Signature of {}:{} is not exist!".format(repo_name, tag)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def retag_image(self, repo_name, tag, src_image, override=True, expect_status_code = 200, expect_response_body = None, **kwargs): | 
					
						
							|  |  |  |         client = self._get_client(**kwargs) | 
					
						
							|  |  |  |         request = swagger_client.RetagReq(tag=tag, src_image=src_image, override=override) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             data, status_code, _ = client.repositories_repo_name_tags_post_with_http_info(repo_name, request) | 
					
						
							|  |  |  |         except ApiException as e: | 
					
						
							|  |  |  |             base._assert_status_code(expect_status_code, e.status) | 
					
						
							|  |  |  |             if expect_response_body is not None: | 
					
						
							|  |  |  |                 base._assert_status_body(expect_response_body, e.body) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         base._assert_status_code(expect_status_code, status_code) | 
					
						
							|  |  |  |         base._assert_status_code(200, status_code) | 
					
						
							|  |  |  |         return data |