def test_client_deploy(patch_post, compressed, monkeypatch): if compressed: response = { "data": { "project": [{"id": "proj-id"}], "createFlowFromCompressedString": {"id": "long-id"}, } } else: response = { "data": {"project": [{"id": "proj-id"}], "createFlow": {"id": "long-id"}} } patch_post(response) monkeypatch.setattr( "prefect.client.Client.get_default_tenant_slug", MagicMock(return_value="tslug") ) with set_temporary_config( {"cloud.api": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): client = Client() flow = prefect.Flow(name="test", storage=prefect.environments.storage.Memory()) flow.result_handler = flow.storage.result_handler with pytest.warns(expected_warning=UserWarning): flow_id = client.deploy( flow, project_name="my-default-project", compressed=compressed, version_group_id=str(uuid.uuid4()), ) assert flow_id == "long-id"
def test_client_deploy_optionally_avoids_building_flow(monkeypatch): response = { "data": { "project": [{ "id": "proj-id" }], "createFlow": { "id": "long-id" } } } post = MagicMock(return_value=MagicMock(json=MagicMock( return_value=response))) monkeypatch.setattr("requests.post", post) with set_temporary_config({ "cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token" }): client = Client() flow = prefect.Flow(name="test") flow_id = client.deploy(flow, project_name="my-default-project", build=False) ## extract POST info variables = json.loads(post.call_args[1]["json"]["variables"]) assert ( variables["input"]["serializedFlow"]["environment"]["serialized_flow"] is None)
def test_client_deploy_builds_flow(patch_post, compressed): if compressed: response = { "data": { "project": [{"id": "proj-id"}], "createFlowFromCompressedString": {"id": "long-id"}, } } else: response = { "data": {"project": [{"id": "proj-id"}], "createFlow": {"id": "long-id"}} } post = patch_post(response) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): client = Client() flow = prefect.Flow(name="test", storage=prefect.environments.storage.Memory()) flow_id = client.deploy( flow, project_name="my-default-project", compressed=compressed ) ## extract POST info if compressed: serialized_flow = decompress( json.loads(post.call_args[1]["json"]["variables"])["input"][ "serializedFlow" ] ) else: serialized_flow = json.loads(post.call_args[1]["json"]["variables"])["input"][ "serializedFlow" ] assert serialized_flow["storage"] is not None
def test_client_deploy_with_flow_that_cant_be_deserialized(patch_post): patch_post({"data": {"project": [{"id": "proj-id"}]}}) with set_temporary_config({ "cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token" }): client = Client() task = prefect.Task() # we add a max_retries value to the task without a corresponding retry_delay; this will fail at deserialization task.max_retries = 3 flow = prefect.Flow(name="test", tasks=[task]) with pytest.raises( ValueError, match=("(Flow could not be deserialized).*" "(`retry_delay` must be provided if max_retries > 0)"), ) as exc: client.deploy(flow, project_name="my-default-project", build=False)
def test_client_deploy_with_bad_proj_name(patch_post): patch_post({"data": {"project": []}}) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): client = Client() flow = prefect.Flow(name="test") with pytest.raises(ValueError) as exc: flow_id = client.deploy(flow, project_name="my-default-project") assert "not found" in str(exc.value) assert "client.create_project" in str(exc.value)
def test_client_deploy_with_bad_proj_name(monkeypatch): response = {"data": {"project": []}} post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) monkeypatch.setattr("requests.post", post) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): client = Client() flow = prefect.Flow(name="test") with pytest.raises(ValueError) as exc: flow_id = client.deploy(flow, project_name="my-default-project") assert "not found" in str(exc.value) assert "client.create_project" in str(exc.value)
def test_client_deploy(monkeypatch): response = { "data": {"project": [{"id": "proj-id"}], "createFlow": {"id": "long-id"}} } post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) monkeypatch.setattr("requests.post", post) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): client = Client() flow = prefect.Flow(name="test") flow_id = client.deploy(flow, project_name="my-default-project") assert flow_id == "long-id"
def test_client_deploy_optionally_avoids_building_flow(monkeypatch, compressed): if compressed: response = { "data": { "project": [{ "id": "proj-id" }], "createFlowFromCompressedString": { "id": "long-id" }, } } else: response = { "data": { "project": [{ "id": "proj-id" }], "createFlow": { "id": "long-id" } } } post = MagicMock(return_value=MagicMock(json=MagicMock( return_value=response))) session = MagicMock() session.return_value.post = post monkeypatch.setattr("requests.Session", session) with set_temporary_config({ "cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token" }): client = Client() flow = prefect.Flow(name="test") flow_id = client.deploy(flow, project_name="my-default-project", build=False, compressed=compressed) ## extract POST info if compressed: serialized_flow = decompress( json.loads(post.call_args[1]["json"]["variables"])["input"] ["serializedFlow"]) else: serialized_flow = json.loads( post.call_args[1]["json"]["variables"])["input"]["serializedFlow"] assert serialized_flow["storage"] is None
def test_client_deploy_rejects_setting_active_schedules_for_flows_with_req_params( active, monkeypatch): post = MagicMock() monkeypatch.setattr("requests.post", post) with set_temporary_config({ "cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token" }): client = Client() flow = prefect.Flow(name="test", schedule=prefect.schedules.Schedule()) flow.add_task(prefect.Parameter("x", required=True)) with pytest.raises(ClientError) as exc: result = client.deploy(flow, project_name="my-default-project", set_schedule_active=active) assert (str( exc.value ) == "Flows with required parameters can not be scheduled automatically.")
def test_client_deploy(monkeypatch, compressed): if compressed: response = { "data": { "project": [{ "id": "proj-id" }], "createFlowFromCompressedString": { "id": "long-id" }, } } else: response = { "data": { "project": [{ "id": "proj-id" }], "createFlow": { "id": "long-id" } } } post = MagicMock(return_value=MagicMock(json=MagicMock( return_value=response))) session = MagicMock() session.return_value.post = post monkeypatch.setattr("requests.Session", session) with set_temporary_config({ "cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token" }): client = Client() flow = prefect.Flow(name="test", storage=prefect.environments.storage.Memory()) flow_id = client.deploy(flow, project_name="my-default-project", compressed=compressed) assert flow_id == "long-id"
def test_client_deploy(patch_post, compressed): if compressed: response = { "data": { "project": [{ "id": "proj-id" }], "createFlowFromCompressedString": { "id": "long-id" }, } } else: response = { "data": { "project": [{ "id": "proj-id" }], "createFlow": { "id": "long-id" } } } patch_post(response) with set_temporary_config({ "cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token" }): client = Client() flow = prefect.Flow(name="test", storage=prefect.environments.storage.Memory()) flow_id = client.deploy( flow, project_name="my-default-project", compressed=compressed, version_group_id=str(uuid.uuid4()), ) assert flow_id == "long-id"