| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | import json | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import boto3 | 
					
						
							|  |  |  | import freezegun | 
					
						
							|  |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2023-11-30 07:55:51 -08:00
										 |  |  | from botocore.client import ClientError | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | from moto import mock_greengrass | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  | from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | from moto.settings import TEST_SERVER_MODE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_create_deployment(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     res = client.create_deployment( | 
					
						
							|  |  |  |         GroupId=group_id, GroupVersionId=latest_grp_ver, DeploymentType="NewDeployment" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert "DeploymentArn" in res | 
					
						
							|  |  |  |     assert "DeploymentId" in res | 
					
						
							|  |  |  |     assert res["ResponseMetadata"]["HTTPStatusCode"] == 200 | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_re_deployment_with_no_deployment_id(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.create_deployment( | 
					
						
							|  |  |  |             GroupId=group_id, | 
					
						
							|  |  |  |             GroupVersionId=latest_grp_ver, | 
					
						
							|  |  |  |             DeploymentType="Redeployment", | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         err["Message"] | 
					
						
							|  |  |  |         == "Your request is missing the following required parameter(s): {DeploymentId}." | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert err["Code"] == "InvalidInputException" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_re_deployment_with_invalid_deployment_id(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deployment_id = "7b0bdeae-54c7-47cf-9f93-561e672efd9c" | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.create_deployment( | 
					
						
							|  |  |  |             GroupId=group_id, | 
					
						
							|  |  |  |             GroupVersionId=latest_grp_ver, | 
					
						
							|  |  |  |             DeploymentType="Redeployment", | 
					
						
							|  |  |  |             DeploymentId=deployment_id, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert err["Message"] == f"Deployment ID '{deployment_id}' is invalid." | 
					
						
							|  |  |  |     assert err["Code"] == "InvalidInputException" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_create_deployment_with_no_core_group(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     create_group_res = client.create_group(Name="TestGroup") | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.create_deployment( | 
					
						
							|  |  |  |             GroupId=group_id, | 
					
						
							|  |  |  |             GroupVersionId=latest_grp_ver, | 
					
						
							|  |  |  |             DeploymentType="NewDeployment", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert ex.value.response["ResponseMetadata"]["HTTPStatusCode"] == 400 | 
					
						
							|  |  |  |     assert ex.value.response["Error"]["Code"] == "MissingCoreException" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     err = json.loads(ex.value.response["Error"]["Message"]) | 
					
						
							|  |  |  |     err_details = err["ErrorDetails"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert err_details[0]["DetailedErrorCode"] == "GG-303" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         err_details[0]["DetailedErrorMessage"] | 
					
						
							|  |  |  |         == "You need a Greengrass Core in this Group before you can deploy." | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_create_deployment_with_invalid_group_id(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.create_deployment( | 
					
						
							|  |  |  |             GroupId="7b0bdeae-54c7-47cf-9f93-561e672efd9c", | 
					
						
							|  |  |  |             GroupVersionId="dfd06e54-6531-4a9b-9505-3c1036b6906a", | 
					
						
							|  |  |  |             DeploymentType="NewDeployment", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert ex.value.response["ResponseMetadata"]["HTTPStatusCode"] == 404 | 
					
						
							|  |  |  |     assert ex.value.response["Error"]["Code"] == "ResourceNotFoundException" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         ex.value.response["Error"]["Message"] == "That group definition does not exist." | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_create_deployment_with_invalid_group_version_id(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     group_version_id = "dfd06e54-6531-4a9b-9505-3c1036b6906a" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.create_deployment( | 
					
						
							|  |  |  |             GroupId=group_id, | 
					
						
							|  |  |  |             GroupVersionId=group_version_id, | 
					
						
							|  |  |  |             DeploymentType="NewDeployment", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert ex.value.response["ResponseMetadata"]["HTTPStatusCode"] == 404 | 
					
						
							|  |  |  |     assert ex.value.response["Error"]["Code"] == "ResourceNotFoundException" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         ex.value.response["Error"]["Message"] | 
					
						
							|  |  |  |         == f"Version {group_version_id} of Group Definition {group_id} does not exist." | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_create_deployment_with_invalid_deployment_type(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     create_group_res = client.create_group(Name="TestGroup") | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.create_deployment( | 
					
						
							|  |  |  |             GroupId=group_id, | 
					
						
							|  |  |  |             GroupVersionId=latest_grp_ver, | 
					
						
							|  |  |  |             DeploymentType="InvalidDeploymentType", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert ex.value.response["ResponseMetadata"]["HTTPStatusCode"] == 400 | 
					
						
							|  |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert err["Code"] == "InvalidInputException" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         err["Message"] | 
					
						
							|  |  |  |         == "That deployment type is not valid.  Please specify one of the following types: {NewDeployment,Redeployment,ResetDeployment,ForceResetDeployment}." | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freezegun.freeze_time("2022-06-01 12:00:00") | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_list_deployments(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  |     latest_grp_ver_arn = create_group_res["LatestVersionArn"] | 
					
						
							|  |  |  |     deployment_type = "NewDeployment" | 
					
						
							|  |  |  |     client.create_deployment( | 
					
						
							|  |  |  |         GroupId=group_id, GroupVersionId=latest_grp_ver, DeploymentType=deployment_type | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     res = client.list_deployments(GroupId=group_id) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert "Deployments" in res | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     deployments = res["Deployments"][0] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert "CreatedAt" in deployments | 
					
						
							|  |  |  |     assert "DeploymentArn" in deployments | 
					
						
							|  |  |  |     assert "DeploymentId" in deployments | 
					
						
							|  |  |  |     assert deployments["DeploymentType"] == deployment_type | 
					
						
							|  |  |  |     assert deployments["GroupArn"] == latest_grp_ver_arn | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |         assert deployments["CreatedAt"] == "2022-06-01T12:00:00.000Z" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freezegun.freeze_time("2022-06-01 12:00:00") | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_get_deployment_status(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  |     deployment_type = "NewDeployment" | 
					
						
							|  |  |  |     create_deployment_res = client.create_deployment( | 
					
						
							|  |  |  |         GroupId=group_id, GroupVersionId=latest_grp_ver, DeploymentType=deployment_type | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deployment_id = create_deployment_res["DeploymentId"] | 
					
						
							|  |  |  |     res = client.get_deployment_status(GroupId=group_id, DeploymentId=deployment_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert res["ResponseMetadata"]["HTTPStatusCode"] == 200 | 
					
						
							|  |  |  |     assert res["DeploymentStatus"] == "InProgress" | 
					
						
							|  |  |  |     assert res["DeploymentType"] == deployment_type | 
					
						
							|  |  |  |     assert "UpdatedAt" in res | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |         assert res["UpdatedAt"] == "2022-06-01T12:00:00.000Z" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_get_deployment_status_with_invalid_deployment_id(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     create_group_res = client.create_group(Name="TestGroup") | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deployment_id = "7b0bdeae-54c7-47cf-9f93-561e672efd9c" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.get_deployment_status(GroupId=group_id, DeploymentId=deployment_id) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert err["Message"] == f"Deployment '{deployment_id}' does not exist." | 
					
						
							|  |  |  |     assert err["Code"] == "InvalidInputException" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_get_deployment_status_with_invalid_group_id(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  |     deployment_type = "NewDeployment" | 
					
						
							|  |  |  |     create_deployment_res = client.create_deployment( | 
					
						
							|  |  |  |         GroupId=group_id, GroupVersionId=latest_grp_ver, DeploymentType=deployment_type | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deployment_id = create_deployment_res["DeploymentId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.get_deployment_status( | 
					
						
							|  |  |  |             GroupId="7b0bdeae-54c7-47cf-9f93-561e672efd9c", DeploymentId=deployment_id | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert err["Message"] == f"Deployment '{deployment_id}' does not exist." | 
					
						
							|  |  |  |     assert err["Code"] == "InvalidInputException" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.skipif( | 
					
						
							|  |  |  |     TEST_SERVER_MODE, | 
					
						
							|  |  |  |     reason="Can't handle path that contains $ in server mode.So ResetGroup api can't use in server mode", | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | @freezegun.freeze_time("2022-06-01 12:00:00") | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_reset_deployments(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     group_arn = create_group_res["Arn"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  |     client.create_deployment( | 
					
						
							|  |  |  |         GroupId=group_id, GroupVersionId=latest_grp_ver, DeploymentType="NewDeployment" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     reset_res = client.reset_deployments(GroupId=group_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert reset_res["ResponseMetadata"]["HTTPStatusCode"] == 200 | 
					
						
							|  |  |  |     assert "DeploymentId" in reset_res | 
					
						
							|  |  |  |     assert "DeploymentArn" in reset_res | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     list_res = client.list_deployments(GroupId=group_id) | 
					
						
							|  |  |  |     reset_deployment = list_res["Deployments"][1] | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert "CreatedAt" in reset_deployment | 
					
						
							|  |  |  |     assert "DeploymentArn" in reset_deployment | 
					
						
							|  |  |  |     assert "DeploymentId" in reset_deployment | 
					
						
							|  |  |  |     assert reset_deployment["DeploymentType"] == "ResetDeployment" | 
					
						
							|  |  |  |     assert reset_deployment["GroupArn"] == group_arn | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |         assert reset_deployment["CreatedAt"] == "2022-06-01T12:00:00.000Z" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.skipif( | 
					
						
							|  |  |  |     TEST_SERVER_MODE, | 
					
						
							|  |  |  |     reason="Can't handle path that contains $ in server mode.So ResetGroup api can't use in server mode", | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_reset_deployments_with_invalid_group_id(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.reset_deployments(GroupId="7b0bdeae-54c7-47cf-9f93-561e672efd9c") | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert err["Message"] == "That Group Definition does not exist." | 
					
						
							|  |  |  |     assert err["Code"] == "ResourceNotFoundException" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.skipif( | 
					
						
							|  |  |  |     TEST_SERVER_MODE, | 
					
						
							|  |  |  |     reason="Can't handle path that contains $ in server mode.So ResetGroup api can't use in server mode", | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_reset_deployments_with_never_deployed_group(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.reset_deployments(GroupId=group_id) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         err["Message"] | 
					
						
							|  |  |  |         == f"Group id: {group_id} has not been deployed or has already been reset." | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert err["Code"] == "ResourceNotFoundException" | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.skipif( | 
					
						
							|  |  |  |     TEST_SERVER_MODE, | 
					
						
							|  |  |  |     reason="Can't handle path that contains $ in server mode.So ResetGroup api can't use in server mode", | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | @mock_greengrass | 
					
						
							|  |  |  | def test_reset_deployments_with_already_reset_group(): | 
					
						
							|  |  |  |     client = boto3.client("greengrass", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     cores = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "CertificateArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/36ed61be9c6271ae8da174e29d0e033c06af149d7b21672f3800fe322044554d", | 
					
						
							|  |  |  |             "Id": "123456789", | 
					
						
							|  |  |  |             "ThingArn": f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:thing/CoreThing", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_core_res = client.create_core_definition( | 
					
						
							|  |  |  |         InitialVersion={"Cores": cores}, Name="TestCore" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     core_def_ver_arn = create_core_res["LatestVersionArn"] | 
					
						
							|  |  |  |     create_group_res = client.create_group( | 
					
						
							|  |  |  |         Name="TestGroup", InitialVersion={"CoreDefinitionVersionArn": core_def_ver_arn} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     group_id = create_group_res["Id"] | 
					
						
							|  |  |  |     latest_grp_ver = create_group_res["LatestVersion"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.create_deployment( | 
					
						
							|  |  |  |         GroupId=group_id, GroupVersionId=latest_grp_ver, DeploymentType="NewDeployment" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     client.reset_deployments(GroupId=group_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							|  |  |  |         client.reset_deployments(GroupId=group_id) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     err = ex.value.response["Error"] | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         err["Message"] | 
					
						
							|  |  |  |         == f"Group id: {group_id} has not been deployed or has already been reset." | 
					
						
							| 
									
										
										
										
											2022-07-04 06:37:22 +09:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-07-06 14:48:14 +00:00
										 |  |  |     assert err["Code"] == "ResourceNotFoundException" |