diff options
author | rameshiyer27 <ramesh.murugan.iyer@est.tech> | 2022-02-07 17:07:38 +0000 |
---|---|---|
committer | rameshiyer27 <ramesh.murugan.iyer@est.tech> | 2022-02-10 14:20:42 +0000 |
commit | 45b653fc5a8d641452247eca5c80cf580609e9bf (patch) | |
tree | 06cfd4529db05dc23cbd63d2fe2e53799eb07bdf /models-provider/src | |
parent | 303d42453fbfcf2381f810b10a496b69aa8bc34b (diff) |
Add policy metadataSet handling as node templates
Each metadataSet is represented as a 'node_template' in Tosca
mapped to a specific node type.
Support added for db operations of node templates as
independent entities.
Detailed documentation available here :
https://wiki.onap.org/display/DW/Enable+Handling+of+Policy+Type+Metadata
Issue-ID: POLICY-3832
Signed-off-by: zrrmmua <ramesh.murugan.iyer@est.tech>
Change-Id: I6c189142b1778ba858aae27cd92d4f136d950208
Diffstat (limited to 'models-provider/src')
10 files changed, 293 insertions, 5 deletions
diff --git a/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java b/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java index 85aab6ec4..5cc5fc96b 100644 --- a/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java +++ b/models-provider/src/main/java/org/onap/policy/models/provider/PolicyModelsProvider.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019-2021 Nordix Foundation. + * Copyright (C) 2019-2022 Nordix Foundation. * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ @@ -25,8 +25,11 @@ package org.onap.policy.models.provider; import java.time.Instant; import java.util.Collection; import java.util.List; +import java.util.Map; import lombok.NonNull; +import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.pap.concepts.PolicyAudit; import org.onap.policy.models.pap.persistence.provider.PolicyAuditProvider.AuditFilter; import org.onap.policy.models.pdp.concepts.Pdp; @@ -38,6 +41,8 @@ import org.onap.policy.models.pdp.concepts.PdpSubGroup; import org.onap.policy.models.pdp.persistence.provider.PdpFilterParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter; +import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; @@ -254,6 +259,59 @@ public interface PolicyModelsProvider extends AutoCloseable { public ToscaServiceTemplate deletePolicy(@NonNull final String name, @NonNull final String version) throws PfModelException; + + /** + * Create tosca node templates. + * + * @param serviceTemplate the definitions of the new node templates to be created. + * @return the tosca node templates that were created + * @throws PfModelException on errors creating tosca node templates + */ + public ToscaServiceTemplate createToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate) + throws PfModelException; + + /** + * Update tosca node templates. + * + * @param serviceTemplate with node templates to be updated. + * @return the service template with node templates that were updated + * @throws PfModelException on errors updating tosca node templates + */ + public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate) + throws PfModelRuntimeException, PfModelException; + + /** + * Delete a tosca node template. + * + * @param name the name of the node template to delete. + * @param version the version of the node template to delete. + * @return the service template with node templates that was deleted + * @throws PfModelException on errors deleting a node template + */ + public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final String name, @NonNull final String version) + throws PfModelException; + + + /** + * Get filtered node template metadataSet entities. + * + * @return the list of metadataSet found + * @throws PfModelException on errors getting node template metadataSet + */ + public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(final String name, + final String version) + throws PfModelException; + + /** + * Get filtered node template entities. + * + * @return the list of nodeTemplates found + * @throws PfModelException on errors getting node template + */ + public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name, + final String version) + throws PfModelException; + /** * Get PDP groups. * diff --git a/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java b/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java index fa7658355..ffb470628 100644 --- a/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java +++ b/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractPolicyModelsProvider.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2021 Nordix Foundation. + * Copyright (C) 2021-2022 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,10 @@ package org.onap.policy.models.provider.impl; import java.time.Instant; import java.util.Collection; import java.util.List; +import java.util.Map; import javax.ws.rs.core.Response; import lombok.NonNull; +import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.dao.PfDao; @@ -44,6 +46,8 @@ import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter; +import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; @@ -194,6 +198,45 @@ public abstract class AbstractPolicyModelsProvider implements PolicyModelsProvid } @Override + public ToscaServiceTemplate createToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate) + throws PfModelException { + assertInitialized(); + return new AuthorativeToscaProvider().createToscaNodeTemplates(getPfDao(), serviceTemplate); + } + + @Override + public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate) + throws PfModelRuntimeException, PfModelException { + assertInitialized(); + return new AuthorativeToscaProvider().updateToscaNodeTemplates(getPfDao(), serviceTemplate); + } + + @Override + public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final String name, @NonNull final String version) + throws PfModelException { + assertInitialized(); + return new AuthorativeToscaProvider().deleteToscaNodeTemplate(getPfDao(), name, version); + } + + @Override + public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(final String name, + final String version) + throws PfModelException { + assertInitialized(); + return new AuthorativeToscaProvider().getNodeTemplateMetadataSet(getPfDao(), name, version); + } + + @Override + public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name, + final String version) + throws PfModelException { + assertInitialized(); + return new AuthorativeToscaProvider().getToscaNodeTemplate(getPfDao(), name, version); + } + + + + @Override public List<PdpGroup> getPdpGroups(final String name) throws PfModelException { assertInitialized(); return new PdpProvider().getPdpGroups(getPfDao(), name); diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java index 57c261cb5..561ef5daa 100644 --- a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java +++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019-2021 Nordix Foundation. + * Copyright (C) 2019-2022 Nordix Foundation. * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. * ================================================================================ @@ -32,6 +32,7 @@ import static org.junit.Assert.assertTrue; import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -53,9 +54,12 @@ import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; +import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter; /** @@ -567,6 +571,31 @@ public class DatabasePolicyModelsProviderTest { databaseProvider.close(); } + @Test + public void testToscaNodeTemplateHandling() throws PfModelException { + databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters); + + ToscaServiceTemplate serviceTemplate = makeNodeTemplate(); + + assertEquals("1.0.1", + databaseProvider.createToscaNodeTemplates(serviceTemplate).getToscaTopologyTemplate().getNodeTemplates() + .get("metadataSet1").getVersion()); + assertEquals(1, databaseProvider.getNodeTemplateMetadataSets(null, null).size()); + + ToscaNodeTemplate nodeTemplate1 = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates() + .get("metadataSet1"); + nodeTemplate1.setMetadata(Map.of("dummyKey", "updatedValue")); + serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1:1.0.1", nodeTemplate1)); + assertEquals("updatedValue", databaseProvider.updateToscaNodeTemplates(serviceTemplate) + .getToscaTopologyTemplate().getNodeTemplates().get("metadataSet1").getMetadata().get("dummyKey")); + + assertThatThrownBy(() -> { + databaseProvider.deleteToscaNodeTemplate("invalidName", "1.0.1"); + }).hasMessage("node template invalidName:1.0.1 not found"); + + databaseProvider.close(); + } + private List<PdpStatistics> makePdpStatisticsList() { PdpStatistics pdpStatistics = new PdpStatistics(); pdpStatistics.setPdpInstanceId(NAME); @@ -576,4 +605,21 @@ public class DatabasePolicyModelsProviderTest { List<PdpStatistics> statisticsArrayList = List.of(pdpStatistics); return statisticsArrayList; } + + private ToscaServiceTemplate makeNodeTemplate() { + ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(); + serviceTemplate.setToscaDefinitionsVersion("sample:1.1.0"); + serviceTemplate.setToscaTopologyTemplate(new ToscaTopologyTemplate()); + serviceTemplate.setNodeTypes(Map.of("org.onap.policy.metadataSet:1.0.0", new ToscaNodeType())); + ToscaNodeTemplate nodeTemplate1 = new ToscaNodeTemplate(); + nodeTemplate1.setName("metadataSet1"); + nodeTemplate1.setVersion("1.0.1"); + nodeTemplate1.setType("org.onap.policy.metadataSet"); + nodeTemplate1.setTypeVersion("1.0.0"); + nodeTemplate1.setMetadata(Map.of("dummyKey", "dummyValue")); + + serviceTemplate.getToscaTopologyTemplate().setNodeTemplates(Map.of("metadataSet1", nodeTemplate1)); + + return serviceTemplate; + } } diff --git a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java index 6cb95ee54..410ecf26a 100644 --- a/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java +++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyBadProviderImpl.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019-2021 Nordix Foundation. + * Copyright (C) 2019-2022 Nordix Foundation. * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. * ================================================================================ @@ -27,8 +27,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import javax.ws.rs.core.Response; import lombok.NonNull; +import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.pap.concepts.PolicyAudit; @@ -43,6 +45,8 @@ import org.onap.policy.models.pdp.persistence.provider.PdpFilterParameters; import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter; +import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; @@ -135,6 +139,38 @@ public class DummyBadProviderImpl implements PolicyModelsProvider { } @Override + public ToscaServiceTemplate createToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate) + throws PfModelException { + return null; + } + + @Override + public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate) + throws PfModelRuntimeException, PfModelException { + return null; + } + + @Override + public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull String name, @NonNull String version) + throws PfModelException { + return null; + } + + @Override + public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(@NonNull String name, + @NonNull String version) + throws PfModelException { + return null; + } + + @Override + public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name, + final String version) + throws PfModelException { + return null; + } + + @Override public List<PdpGroup> getPdpGroups(String name) throws PfModelException { return Collections.emptyList(); } diff --git a/models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java index b9b34a24d..dcc436a05 100644 --- a/models-provider/src/main/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java +++ b/models-provider/src/test/java/org/onap/policy/models/provider/impl/DummyPolicyModelsProviderImpl.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019-2021 Nordix Foundation. + * Copyright (C) 2019-2022 Nordix Foundation. * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2020 Bell Canada. All rights reserved. * ================================================================================ @@ -26,10 +26,12 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import javax.ws.rs.core.Response; import lombok.NonNull; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.resources.ResourceUtils; +import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.pap.concepts.PolicyAudit; @@ -45,6 +47,8 @@ import org.onap.policy.models.provider.PolicyModelsProvider; import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityFilter; +import org.onap.policy.models.tosca.authorative.concepts.ToscaEntityKey; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; @@ -179,6 +183,38 @@ public class DummyPolicyModelsProviderImpl implements PolicyModelsProvider { } @Override + public ToscaServiceTemplate createToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate) + throws PfModelException { + return getDummyNodeTemplateResponse("dummyimpl/DummyToscaNodeTemplateResponse.json"); + } + + @Override + public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull ToscaServiceTemplate serviceTemplate) + throws PfModelRuntimeException, PfModelException { + return getDummyNodeTemplateResponse("dummyimpl/DummyToscaNodeTemplateResponse.json"); + } + + @Override + public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull String name, @NonNull String version) + throws PfModelException { + return getDummyNodeTemplateResponse("dummyimpl/DummyToscaNodeTemplateResponse.json"); + } + + @Override + public List<Map<ToscaEntityKey, Map<String, Object>>> getNodeTemplateMetadataSets(@NonNull String name, + @NonNull String version) + throws PfModelException { + return new ArrayList<>(); + } + + @Override + public List<Map<PfConceptKey, ToscaNodeTemplate>> getToscaNodeTemplate(final String name, + final String version) + throws PfModelException { + return new ArrayList<>(); + } + + @Override public List<PdpGroup> getPdpGroups(final String name) throws PfModelException { return new ArrayList<>(); } @@ -297,4 +333,27 @@ public class DummyPolicyModelsProviderImpl implements PolicyModelsProvider { return serviceTemplate; } + + /** + * Return a tosca node template dummy response. + * + * @param fileName the file name containing the dummy response + * @return the service template with the dummy response + */ + protected ToscaServiceTemplate getDummyNodeTemplateResponse(final String fileName) { + var standardCoder = new StandardCoder(); + ToscaServiceTemplate serviceTemplate; + + try { + serviceTemplate = + standardCoder.decode(ResourceUtils.getResourceAsString(fileName), ToscaServiceTemplate.class); + if (serviceTemplate == null) { + throw new PfModelException(Response.Status.INTERNAL_SERVER_ERROR, "error reading specified file"); + } + } catch (Exception exc) { + throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "error serializing object", exc); + } + + return serviceTemplate; + } } diff --git a/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json new file mode 100644 index 000000000..291ef47ac --- /dev/null +++ b/models-provider/src/test/resources/dummyimpl/DummyToscaNodeTemplateResponse.json @@ -0,0 +1,46 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_1_0", + "node_types": { + "org.onap.nodetypes.policy.MetadataSet": { + "derived_from": "tosca.nodetypes.Root", + "version": "1.0.0" + } + }, + "topology_template": { + "node_templates": { + "apexMetadata_grpc": { + "version": "1.2.1", + "type": "org.onap.nodetypes.policy.MetadataSet", + "type_version": "1.0.0", + "description": "Metadata set for GRPC", + "metadata": { + "policyModel": { + "key": { + "name": "GrpcPolicyModel", + "version": "1.0.1" + } + }, + "threshold": 3.14, + "state": "active" + } + }, + "apexMetadata_adaptive": { + "version": "2.3.1", + "type": "org.onap.nodetypes.policy.MetadataSet", + "type_version": "1.0.0", + "description": "Metadata set for an Adaptive Policy", + "metadata": { + "policyModel": { + "key": { + "name": "AdaptivePolicyModel", + "version": "1.2.1" + } + }, + "radius": 1.23, + "height": 2.13, + "length": 45 + } + } + } + } +}
\ No newline at end of file diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json index 27de380c2..27de380c2 100644 --- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json +++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyDeleteResponse.json diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyGetResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyGetResponse.json index 27de380c2..27de380c2 100644 --- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyGetResponse.json +++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyGetResponse.json diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json index 27de380c2..27de380c2 100644 --- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json +++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeDeleteResponse.json diff --git a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json index 477d4477a..477d4477a 100644 --- a/models-provider/src/main/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json +++ b/models-provider/src/test/resources/dummyimpl/DummyToscaPolicyTypeGetResponse.json |