Jonathan Hurley created AMBARI-23147:
----------------------------------------

             Summary: Expose Repository CRUD via the Mpack Endpoint
                 Key: AMBARI-23147
                 URL: https://issues.apache.org/jira/browse/AMBARI-23147
             Project: Ambari
          Issue Type: Task
    Affects Versions: 3.0.0
            Reporter: Jonathan Hurley
            Assignee: Jonathan Hurley
             Fix For: 3.0.0


With the removal of version definitions and repository versions, we need a new 
way of exposing and managing repositories. Since repositories are now 
associated with management packs, it makes sense to expose these off of the 
{{mpack}} endpoint.

The question is whether we want to continue our model of having 
OperatingSystems read-only and adding sub-resources of repositories off of the 
OS or changing to something simpler like having a single object serialized 
which contains all of the information. 

h5. Scenario 1: Operating Systems are 1st Class Resources
I think that having each repository as a sub-resource is a bit of an overkill. 
We certainly don't need that level of granularity. But we could make the 
{{operating_system}} the lowest level so that you could update all repositories 
for a given operating system at once. For example:

{code:title=http://c7001.ambari.apache.org:8080/api/v1/mpacks/1}
{
{
  "href": "http://c7401.ambari.apache.org:8080/api/v1/mpacks/1";,
  "MpackInfo": {
    "id": 1,
    "mpack_description": "Hortonworks Data Platform Core",
    "mpack_id": "hdpcore",
    "mpack_name": "HDPCORE",
    "mpack_uri": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDPCORE-1.0.0-b96/mpack.json";,
    "mpack_version": "1.0.0-b96",
    "operating_systems": [
      {
        "href": 
"http://c7401.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/redhat7";,
        "OperatingSystems": {
          "os_type": "redhat7",
          "stack_name": "HDPCORE",
          "stack_version": "1.0.0-b96"
        }
      },
      {
        "href": 
"http://c7401.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/ubuntu12";,
        "OperatingSystems": {
          "os_type": "ubuntu12",
          "stack_name": "HDPCORE",
          "stack_version": "1.0.0-b96"
        }
      }
    ]
  }
}
{code}

This allows us to use the operating system type (like {{redhat7}} or 
{{ubuntu12}}) as a key so we can get more information about the OS:
{code:title=http://c7401.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/redhat7}
{
  "href": 
"http://c7401.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/redhat7?fields=repositories/*";,
  "OperatingSystems": {
    "os_type": "redhat7",
    "stack_name": "HDPCORE",
    "stack_version": "1.0.0-b96"
  },
  "repositories": [
    {
      "href": 
"http://c7401.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/redhat7/repositories/HDP-UTILS-1.1.0.21";,
      "Repositories": {
        "base_url": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDP-UTILS-1.1.0.22/";,
        "components": null,
        "default_base_url": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDP-UTILS-1.1.0.22/";,
        "distribution": null,
        "mirrors_list": null,
        "os_type": "redhat7",
        "repo_id": "HDP-UTILS-1.1.0.21",
        "repo_name": "HDP-UTILS",
        "stack_name": "HDPCORE",
        "stack_version": "1.0.0-b96",
        "tags": [],
        "unique": false
      }
    },
    {
      "href": 
"http://c7401.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/redhat7/repositories/HDPCORE-1.0.0-b96";,
      "Repositories": {
        "base_url": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDPCORE-1.0.0-b96";,
        "components": null,
        "default_base_url": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDPCORE-1.0.0-b96";,
        "distribution": null,
        "mirrors_list": null,
        "os_type": "redhat7",
        "repo_id": "HDPCORE-1.0.0-b96",
        "repo_name": "HDPCORE",
        "stack_name": "HDPCORE",
        "stack_version": "1.0.0-b96",
        "tags": [],
        "unique": false
      }
    }
  ]
}
{code}

This maintains the current structure of {{operating_systems}} being the wrapper 
around each repository. Each {{operating_system}} contains the actual 
repositories:

{code:title=http://c7001.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/redhat7/repositories/HDPCORE-1.0.0-b96}
{
  "href" : 
"http://c7001.ambari.apache.org:8080/api/v1/stacks/HDPCORE/versions/1.0.0-b96/operating_systems/redhat7/repositories/HDPCORE-1.0.0-b96";,
  "Repositories" : {
    "base_url" : 
"http://repo.ambari.apache.org/hdpcore/centos7/HDPCORE-1.0.0-b96";,
    "components" : null,
    "default_base_url" : 
"http://repo.ambari.apache.org/hdpcore/centos7/HDPCORE-1.0.0-b96";,
    "distribution" : null,
    "mirrors_list" : null,
    "os_type" : "redhat7",
    "repo_id" : "HDPCORE-1.0.0-b96",
    "repo_name" : "HDPCORE",
    "stack_name" : "HDPCORE",
    "stack_version" : "1.0.0-b96",
    "tags" : [ ],
    "unique" : false
  }
}
{code}

- Allows querying by the OS type (not sure if we need or want that)
- Allows updating all repositories for an OS type in 1 call
- Requires 1 call per operating system to update all repos

h5. Scenario 2: Serialized Object without ResourceProvider Support
The other option is just to serialize the information we have directly as part 
of the mpack endpoint. 

{code:title=http://c7401.ambari.apache.org:8080/api/v1/mpacks/1}
{
  "href": "http://c7401.ambari.apache.org:8080/api/v1/mpacks/1";,
  "MpackInfo": {
    "id": 1,
    "mpack_description": "Hortonworks Data Platform Core",
    "mpack_id": "hdpcore",
    "mpack_name": "HDPCORE",
    "mpack_uri": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDPCORE-1.0.0-b96/mpack.json";,
    "mpack_version": "1.0.0-b96",
    "operating_systems": [
      {
        "repositories": [
          {
            "distribution": null,
            "components": null,
            "unique": true,
            "tags": [],
            "base_url": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDPCORE-1.0.0-b96";,
            "os_type": "redhat7",
            "repo_id": null,
            "repo_name": null,
            "mirrors_list": null,
            "default_base_url": null,
            "ambari_managed": true
          },
          {
            "distribution": null,
            "components": null,
            "unique": false,
            "tags": [],
            "base_url": 
"http://repo.ambari.apache.org/hdpcore/centos7/HDP-UTILS-1.1.0.22/";,
            "os_type": "redhat7",
            "repo_id": null,
            "repo_name": null,
            "mirrors_list": null,
            "default_base_url": null,
            "ambari_managed": true
          }
        ],
        "os_type": "redhat7",
        "ambari_managed": true
      },
      {
        "repositories": [
          {
            "distribution": null,
            "components": null,
            "unique": false,
            "tags": [],
            "base_url": 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.21/repos/ubuntu12";,
            "os_type": "ubuntu12",
            "repo_id": null,
            "repo_name": null,
            "mirrors_list": null,
            "default_base_url": null,
            "ambari_managed": true
          },
          {
            "distribution": null,
            "components": null,
            "unique": true,
            "tags": [],
            "base_url": 
"http://dev.hortonworks.com.s3.amazonaws.com/HDPCORE/ubuntu12/1.x/BUILDS/1.0.0-b96";,
            "os_type": "ubuntu12",
            "repo_id": null,
            "repo_name": null,
            "mirrors_list": null,
            "default_base_url": null,
            "ambari_managed": true
          }
        ],
        "os_type": "ubuntu12",
        "ambari_managed": true
      }
    ],
    "registry_id": null,
    "stack_name": "",
    "stack_version": ""
  },
  "operating_system": [],
  "version": []
}
{code}

- Operating systems and repositories are no longer really "resources". You 
can't query by them and can't update them individually
- Much simpler to implement
- Requires updating all repos together, but can be done in 1 call



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to