Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API-related enhancement requests #37

Closed
dev4unet opened this issue Oct 23, 2024 · 12 comments
Closed

API-related enhancement requests #37

dev4unet opened this issue Oct 23, 2024 · 12 comments

Comments

@dev4unet
Copy link
Member

일부 API들에 대해서 관리자가 사용하는 Web UI 구현 시 고려 및 개선되었으면 싶은 기능들이 있어서 검토 요청 드립니다.

  1. Connection 정보에서 Port는 암호화 대상에서 제외 하기

    • WEB UI에서 출력 및 수정할 때 매번 복호화 하면서 처리하기 번거롭고 Port 번호는 보안 이슈가 적을 것 같습니다.
  2. 조회된 Connection 정보의 ID & Password & Privatekey 복호화 방법
    or 복호화를 위해 제공되는 API가 있나요?

  3. Connection 정보 수정 시 암호화에 따른 이슈

    • 현재는 Desc 등의 기본 정보만 수정하고 싶어도 ID & Password & Privatekey의 암호화된 값을 그대로 전달하면 새로운 값으로 인식되어서 다시 암호화된 값으로 저장되기 때문에 인증 정보가 달라져서 해당 서버에 접속할 수 없게 됨.
    • 따라서, Connection 정보를 수정할 때 이미 암호화된 기존의 ID & Password & Privatekey의 경우에는 수정하지 말고 다른 항목만 수정되도록 하면 좋을 것 같습니다..
      • 만약, 암호화된 필드의 수정이 필요한 경우 수정을 위한 ID & Password & Privatekey 각각에 대해 별도의 수정을 위한 필드로 전달 받아서 업데이트하는 방식도 필요할 것 같습니다. (예: request_update_id / request_update_password …)
  4. 모델 정보 통일 관련

    • 현재 모델 정보를 조회하는 방법이 아래의 3가지인데 단일 서버를 조회하나 그룹 단위로 조회하나 서버의 수만 다를 뿐 Beetle에 전달하기 위한 최종 입력 모델 포멧은 동일해야 하지 않을까 싶습니다.
    • 현재는 아래 3개의 API에 대해서 출력 형태가 달라서 각각의 API에 대해 Beetle이 원하는 형태로 가공이 필요한데 나중에 포멧이 변경될 경우도 있으므로 가급적 /{{connId}}/infra/refined 와 /{{sgId}}/infra/refined에 대해서 /refined/{{CSP}}/{{region}}의 결과처럼 Beetle이 원하는 형태의 최종 모델 정보로 응답 값을 통일해주시면 좋을 것 같습니다. (CSP와 Region 정보 빠져있는 상태로 리턴)
      {{baseUrl}}/source_group/{{sgId}}/connection_info/{{connId}}/infra/refined
      {{baseUrl}}/source_group/{{sgId}}/infra/refined
      {{baseUrl}}/source_group/{{sgId}}/infra/refined/{{CSP}}/{{region}}
  5. Connection 정보에 CollectedDatetime 정보 포함

    • 현재 Honeybee 구조상 infra 및 software 등의 정보를 조회하기 위해서는 먼저 Import 요청이 필수인데 Connection 정보에 Import를 시도했는지 안 했는지 정보가 없어서 WEB UI를 구현할 때 사용자가 Raw 정보나 소스 모델 정보 조회를 위해서는 매번 Import를 실행해야 하므로 가능하다면 목록 및 상세 정보에 Infra 및 SW 등에 대해 각각의 Import(Collected)된 시간 정보도 함께 알려주면 좋을 것 같습니다. (임의로 CollectedDatetime이라고 명명했습니다.)
      • connection_info에는 개별 연결에 대한 CollectedDatetime 정보 (예: infaCollectedDatetime / softwareCollectedDatetime)
      • 그룹 단위의 목록에서는 connection_info_status_count처럼 그룹 대상의 요청에 대한 CollectedDatetime 정보 포함
@ish-hcc
Copy link
Member

ish-hcc commented Oct 23, 2024

@dev4unet @yunkon-kim

  1. 반영하겠습니다.
  2. 현재는 타 모듈에서 소스 구현으로 인해서만 복호화가 가능합니다
  3. 현재 모든 입력은 평문으로 받고 조회시에만 복호화 하여 제공되고 있습니다. 업데이트시 본래 입력하고자 할 데이터 그리고 업데이트 할 항목에 대해서만 입력해 주시면 해당 부분만 업데이트 됩니다.
    예시) password만 업데이트
{
  "password": "XXXXXXXXXXX"
}
  1. {{baseUrl}}/source_group/{{sgId}}/infra/refined/{{CSP}}/{{region}} API는 Workflow 테스트를 위해 임시로 만든 API 여서 삭제할 예정입니다. Beetle에서는 VM Array 형태로 필요하기 때문에
    Beetle에서 실제로 필요한 API는 {{baseUrl}}/source_group/{{sgId}}/infra/refined 에 해당되고,
    {{baseUrl}}/source_group/{{sgId}}/connection_info/{{connId}}/infra/refined API는 Connection 별로도 정제된 데이터를 볼 수 있게끔 편의를 위해서 추가된 API 입니다.
    4번에 대한 부분에 사전에 Beetle 모듈과 협의가 된 부분이기도 하고, CSP와 Region 정보는 사용자에 의해서 별도로 입력 받는 것으로 하자는 의견이 있던 것으로 기억하고 있어
    말씀드린 {{baseUrl}}/source_group/{{sgId}}/infra/refined/{{CSP}}/{{region}} API만 삭제하고, 현상황 그대로 유지할 계획입니다.
  2. 업데이트 시점 시간 정보가 필요할 것으로 판단됩니다. 고려하였던 부분인데 반영하도록 하겠습니다.

@yunkon-kim
Copy link
Member

@dev4unet @ish-hcc (cc. @powerkimhub @innodreamer)

안녕하세요. 생각을 맞추기 위한 차원에서 4번과 관련하여 의견을 말씀드립니다.

현재 인프라 모델 정보는 OnPremInfra로 통일되어 있습니다.

각 서브시스템에서 이를 활용해서 API 들을 제공하고 있는데요.
아시다시피 서브시스템 별로 담당하는 목적에 맞게 API를 설계 및 제공하는 과정에서 부가 정보를 필요로 하게 됩니다.
서브시스템들은 각각의 목표 또는 범위가 있기도하여 서브시스템들 간에 API Request/response 들이 달라지는 것은 어찌보면 자연스럽다는 생각도 듭니다.
서브시스템 연구 개발 상의 독립성/유연성 측면에서도 좋을 것으로 보입니다.

관련하여, 개선(안), 의견, 우려, 대안 등이 있으시면 편하게 답글 남겨주시기 바랍니다.

@yunkon-kim
Copy link
Member

구체적인 사항에서 협의할 내용이 있을지 몰라 구현을 중심의 부연 설명을 드립니다.

살펴보시고, Portal/사용자 관점에서 필요하신 부분들을 말씀해주시면 좋을 것 같습니다.

먼저, 관련 서브시스템 간에 API 에 OnPremInfra 모델이 반영된 현황 입니다.

Honeybee 컴퓨팅 인프라 소스 모델 조회 API GET /source_group/{sgId}/infra/refined

Damselfly 컴퓨팅 인프라 소스 사용자 모델 등록 API POST /onpremmodel

Beetle 목표 클라우드 인프라 추천 API POST /recommendation/mci

다음으로, Honeybee의 범위와 API에 CSP, Region 정보 포함의 필요 여부 관련 사항입니다.

  • 소스 컴퓨팅 환경을 분석하여 대상 정보(인프라, SW, 데이터)를 제공하는 시스템입니다.
  • 따라서, 아래 API 처럼 목표 클라우드의 정보를 입력하는 것은 앞으로 혼동될 여지가 있는 부분으로 판단하였습니다.
    • {{baseUrl}}/source_group/{{sgId}}/infra/refined/{{CSP}}/{{region}}
  • 관련해서 고려한 시나리오가 아래와 같습니다.
    1. 사용자가 소스 인프라 모델 정보를 얻은 후,
    2. CSP 및 Region을 선택하고,
    3. 목표 모델을 추천을 요청하고,
    4. 이를 바탕으로 인프라 마이그레이션을 수행한다.

Beetle의 목표 클라우드 인프라 추천 API의 Provider, Region 관련

  • 기존에는 Request Body에서 Provider, Region, OnpremiseInfraModel을 입력 받았으나,
  • Cicada의 현황 반영 및 지원을 위해, Provier, Region을 QueryParams로도 받고 있습니다.
  • 자세한 설명은 API docs를 참고하시기 바랍니다.

@ish-hcc
Copy link
Member

ish-hcc commented Oct 24, 2024

@yunkon-kim
추가 안내사항에 대해서 자세히 말씀해 주셔서 감사합니다.

@dev4unet
Copy link
Member Author

dev4unet commented Oct 24, 2024

@ish-hcc @yunkon-kim 간단한 내용인데 테스트 후 글로 다시 자세히 쓰려니 답변이 좀 늦었습니다.
빠른 답변 감사드리며 혹시나 해서 다시 한번 입/출력들을 살펴봤습니다.
현재 이슈가 되는 부분은 4.번 항목에서 어느 정도까지를 모델로 하느냐 일 것 같습니다.
개인적으로 생각했었던 기본 방향은 필요에 의해서 고정된 일부 항목의 값은 수정할 수 있겠지만 사용자는 아무런 지식이 없더라도 각 서브시스템들의 입출력 정보를 그대로 사용할 수 있어야 하지 않나 싶었습니다.

예를 들어, Honeybee로부터 인프라 소스 모델 정보를 얻어서 아무런 수정 없이도 Beetle의 인프라 추천 모델 요청의 입력으로 그대로 전달했을 때 동작에 무리가 없어야 하지 않나 싶습니다.

하지만, 현재는 받은 정보를 그대로 사용하지 못하고 각 시스템의 요청에 맞도록 모델 포멧을 가공하는 추가 작업이 필수로 발생합니다.
예를 들어, 인프라 마이그레이션의 경우 Honeybee로부터 조회된 소스 모델의 값은 아래와 같습니다.
/source_group/{{sgId}}/infra/refined

{
  "network": {
    "ipv4Networks": [
      "172.26.240.0/20"
    ],
    "ipv6Networks": [
      "string"
    ]
  },
  "servers": [
    {
      "cpu": {
        "architecture": "x86_64",
        "cores": 18,
        "cpus": 2,
        "maxSpeed": 3.6,
        "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz",
        "threads": 36,
        "vendor": "GenuineIntel"
      },
      "dataDisks": [
        {
          "available": 0,
          "label": "string",
          "totalSize": 1024,
          "type": "SSD",
          "used": 0
        }
      ],
      "hostname": "string",
      "interfaces": [
        {
          "ipv4CidrBlocks": [
            "string"
          ],
          "ipv6CidrBlocks": [
            "string"
          ],
          "macAddress": "string",
          "mtu": 0,
          "name": "string",
          "state": "string"
        }
      ],
      "memory": {
        "available": 0,
        "totalSize": 128,
        "type": "DDR4",
        "used": 0
      },
      "os": {
        "id": "ubuntu",
        "idLike": "debian",
        "name": "Ubuntu",
        "prettyName": "Ubuntu 22.04.3 LTS",
        "version": "22.04.3 LTS (Jammy Jellyfish)",
        "versionCodename": "jammy",
        "versionId": "22.04"
      },
      "rootDisk": {
        "available": 0,
        "label": "string",
        "totalSize": 1024,
        "type": "SSD",
        "used": 0
      },
      "routingTable": [
        {
          "destination": "string",
          "gateway": "string",
          "interface": "string",
          "linkState": "string",
          "metric": 0,
          "protocol": "string",
          "scope": "string",
          "source": "string"
        }
      ]
    }
  ]
}

그리고 단일 서버 정보를 조회하는 경우 응답이 아래와 같습니다.
/source_group/{{sgId}}/connection_info/{{connId}}/infra/refined

{
  "cpu": {
    "architecture": "x86_64",
    "cores": 18,
    "cpus": 2,
    "maxSpeed": 3.6,
    "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz",
    "threads": 36,
    "vendor": "GenuineIntel"
  },
  "dataDisks": [
    {
      "available": 0,
      "label": "string",
      "totalSize": 1024,
      "type": "SSD",
      "used": 0
    }
  ],
  "hostname": "string",
  "interfaces": [
    {
      "ipv4CidrBlocks": [
        "string"
      ],
      "ipv6CidrBlocks": [
        "string"
      ],
      "macAddress": "string",
      "mtu": 0,
      "name": "string",
      "state": "string"
    }
  ],
  "memory": {
    "available": 0,
    "totalSize": 128,
    "type": "DDR4",
    "used": 0
  },
  "os": {
    "id": "ubuntu",
    "idLike": "debian",
    "name": "Ubuntu",
    "prettyName": "Ubuntu 22.04.3 LTS",
    "version": "22.04.3 LTS (Jammy Jellyfish)",
    "versionCodename": "jammy",
    "versionId": "22.04"
  },
  "rootDisk": {
    "available": 0,
    "label": "string",
    "totalSize": 1024,
    "type": "SSD",
    "used": 0
  },
  "routingTable": [
    {
      "destination": "string",
      "gateway": "string",
      "interface": "string",
      "linkState": "string",
      "metric": 0,
      "protocol": "string",
      "scope": "string",
      "source": "string"
    }
  ]
}

하지만 Beetle의 입력 정보는 아래처럼 전달해야 합니다.
/recommendation/mci?desiredProvider=aws&desiredRegion=ap-northeast-2

{
  "desiredProvider": "aws",
  "desiredRegion": "ap-northeast-2",
  "onpremiseInfraModel": {
    "network": {
      "ipv4Networks": [
        "172.26.240.0/20"
      ],
      "ipv6Networks": [
        "string"
      ]
    },
    "servers": [
      {
        "cpu": {
          "architecture": "x86_64",
          "cores": 18,
          "cpus": 2,
          "maxSpeed": 3.6,
          "model": "Intel(R) Xeon(R) Gold 6140 CPU @ 2.30GHz",
          "threads": 36,
          "vendor": "GenuineIntel"
        },
        "dataDisks": [
          {
            "available": 0,
            "label": "string",
            "totalSize": 1024,
            "type": "SSD",
            "used": 0
          }
        ],
        "hostname": "string",
        "interfaces": [
          {
            "ipv4CidrBlocks": [
              "string"
            ],
            "ipv6CidrBlocks": [
              "string"
            ],
            "macAddress": "string",
            "mtu": 0,
            "name": "string",
            "state": "string"
          }
        ],
        "memory": {
          "available": 0,
          "totalSize": 128,
          "type": "DDR4",
          "used": 0
        },
        "os": {
          "id": "ubuntu",
          "idLike": "debian",
          "name": "Ubuntu",
          "prettyName": "Ubuntu 22.04.3 LTS",
          "version": "22.04.3 LTS (Jammy Jellyfish)",
          "versionCodename": "jammy",
          "versionId": "22.04"
        },
        "rootDisk": {
          "available": 0,
          "label": "string",
          "totalSize": 1024,
          "type": "SSD",
          "used": 0
        },
        "routingTable": [
          {
            "destination": "string",
            "gateway": "string",
            "interface": "string",
            "linkState": "string",
            "metric": 0,
            "protocol": "string",
            "scope": "string",
            "source": "string"
          }
        ]
      }
    ]
  }
}

즉, Beetle의 경우 필수 소스모델 JSON 정보는 아래처럼 생겼습니다.
"onpremiseInfraModel": {
"network": {},
"servers": []
}

그렇다면 개인적으로 봤을 때 인프라 소스 모델 포멧은 onpremiseInfraModel항목을 포함한 하위 항목이지 않나 싶습니다.

현재는 각 서브 시스템들이 위처럼 응답 및 입력을 요청하는 상황인데

  1. 특정 그룹의 인프라를 마이그레이션 하기 위해 사용자는 Honeybee의 /source_group/{{sgId}}/infra/refined API를 호출한 경우에는 그대로 Beetle에 전달할 수 없고 최소한이지만 Beetle에 전달하기 위해 onpremiseInfraModel 요소를 추가해서 하위에 Honeybee의 조회 결과를 넣어야 하며

  2. 그룹 하위에 있는 특정 서버 하나만 마이그레이션 하기 위해서 /source_group/{{sgId}}/connection_info/{{connId}}/infra/refined API를 호출한 경우에는 onpremiseInfraModel 요소 외에도 network와 servers 요소를 추가해서 servers 하위에 정보를 추가해야 합니다.

위처럼 Honeybee에서 주는 정보와 Beetle이 원하는 입력 모델의 차이를 Damselfly에서 처리해주나 싶었지만 Damselfly도 완성된 모델 정보를 입력으로 받고 있기 때문에 현재는 고스란히 시스템을 이용하는 이용자까지 모델 포멧에 강제로 관여해야만 합니다.

**개인적으로는 그룹 단위로 인프라 소스 모델 정보를 요청하든 특정 서버에 대한 인프라 소스 모델 정보를 요청하든 모두 마이그레이션을 위한 인프라 소스 모델에 대한 요청이니 지금처럼 인프라 소스 모델에 활용할 수 있는 형태의 정보가 아니라 onpremiseInfraModel요소를 포함한 인프라 소스 모델로 나와야 하지 않을까 생각됩니다.

그 외 특정 시스템에서 로직 처리를 위해 필요한 추가 정보들은 해당 기능을 수행하기 위해 모델 외의 부가 정보로 전달 받아서 처리해야한다고 생각합니다.
즉, 추가 정보를 필요로하는 시스템에서 desiredProvider처럼 모델 포멧 외의 필드로 전달 받아서 처리하는 것이 맞지 않나 싶습니다.

그래야 사용자는 향후 추가되거나 변경될 모델 포멧에 대해서 신경 쓰지 않고 마이그레이션 하려는 대상이 온프라미스인지 클라우드인지 등에 구애 받지 않고 담당 시스템의 응답으로 받은 모델 정보에서 필요한 항목의 값만 수정하면서 편하게 이용할 수 있지 않을까 싶습니다.

그렇지 않다면 두 시스템을 이용하려는 사용자는 두 시스템의 연동을 위해 각각의 목적에 맞게 특정 버전의 모델 포멧에 대해서 매번 작업을 해야 하며 포멧이 변경되면 매번 수정이 발생 할 수 있으리라 생각됩니다.

현재 인프라 소스 모델만 놓고 보면 Honeybee의 /source_group/{{sgId}}/infra/refined/{{CSP}}/{{region}} API의 응답만이 Beetle이 원하는 onpremiseInfraModel 정보를 포함한 인프라 소스 모델 형태로 리턴되고 있습니다.
"onpremiseInfraModel": {
"network": {},
"servers": []
}

위 형태가 저희가 필요한 형태인데 위 API의 CSP와 Region정보를 포함해서 요청하는 것은 저희 쪽에서는 맞지 않기에...
개인적으로는 위의 /source_group/{{sgId}}/infra/refined/{{CSP}}/{{region}} API의 응답 결과에서 소스 모델에 불필요한 desiredProvider와 desiredRegion 정보가 빠진 정보로 /source_group/{{sgId}}/connection_info/{{connId}}/infra/refined API와 /source_group/{{sgId}}/infra/refined API의 인프라 소스 모델 응답 포멧을 통일하는 것이 좋지 않을까 의견 드렸었습니다.

@yunkon-kim
Copy link
Member

@dev4unet @ish-hcc @innodreamer (cc. @powerkimhub )

자세히 설명해주셔서 감사합니다!

서브시스템들이 안정화 되지 못한 상태에서 다양한 서브시스템의 API를 활용하시는 과정에서 Request/response body의 차이로 인해 어려움을 겪으시는 것 같습니다. 모델을 다루는 방식의 차이로 인한 이슈도 이해되는 부분이 있습니다.

우선, 설명해 주신 내용을 바탕으로 추진 방향을 공유 드려보고자 합니다.

1. 다양한 모델의 확장성을 고려하여 "모델이름:모델"로 스키마 개선

"onpremiseInfraModel": {
  "network": {},
  "servers": []
}

(Schema)

"xxxModel": {
"xxx": {},
"xxx": []
}

이를 위해, cm-model에서 개선 후, 서브시스템에서 반영해 주시면 될 것 같습니다.
아마도, Struct embedding 방식으로 반영하게 될 것으로 예상합니다.
관련하여 Beetle에 선 반영 후, 해당 PR 공유드리겠습니다. 참고하시면 될 것 같습니다.

2. 1번을 반영하시면서, 아래 Honeybee API들의 출력에 대한 의견을 검토해 보신 후, 의견 공유 또는 개선 해주시면 될 것 같습니다.

  • /source_group/{{sgId}}/infra/refined
  • /source_group/{{sgId}}/connection_info/{{connId}}/infra/refined

3. 2번이 이후에, Damselfly에 개선된 모델을 반영해 주시기 바랍니다.


추가로, 생각이 다른 부분이 있어 공유드립니다. 진행하면서 의견을 맞춰가면 좋을 것 같습니다.

  • 각 서브시스템들의 입출력 정보를 그대로 사용하는 부분과 그렇지 못한 부분이 있을 것 같습니다.
    • 위 2번의 경우는 맞추는 편이 좋을 것 같고요.
    • 서브시스템 간에 입출력을 동일시 하기에는 어려운 부분이 있을 것 같습니다.
    • 사유)
      • Honeybee와 Beetle은 기능을 잘 만들어 API로 제공하고 있어, 사용자(admin) 측면의 활용성을 고려하기 어렵습니다.
      • Butterfly server에서 이러한 부분을 적절히 조율해 주시면 좋을 것 같습니다. Honeybee의 출력을 그대로 전달 할 수도 있고, 마사지하여 전달할 수 도 있을 것이라 생각합니다.

마지막으로, 여전히 모델에 대한 견해 차가 있고, 다양한 모델이 추가될 것이므로
유연하게 모델을 정의하고 활용할 수 있는 방법에 대해 함께 고민하고 만들어 가면 좋겠습니다.

@yunkon-kim
Copy link
Member

@ish-hcc @innodreamer

업데이트 현황 공유드립니다.

  • cm-model v0.0.3: https://github.com/cloud-barista/cm-model/releases

  • cm-beetle PR 참고: Align inframodel with cm-model v0.0.3 cm-beetle#139

    • pkg 명 수정사항 반영
    -	onprem "github.com/cloud-barista/cm-model/infra/onprem"
    +    inframodel "github.com/cloud-barista/cm-model/infra/onprem"
    • Struct embedding 적용 (변경 전과 같이 활용하시는 것도 가능합니다. "모델명:모델" 규칙만 맞추겠습니다.)
    type RecommendInfraRequest struct {
          DesiredProvider string `json:"desiredProvider" example:"aws"`
    	DesiredRegion   string `json:"desiredRegion" example:"ap-northeast-2"`
    -	OnpremiseInfraModel onprem.OnPremInfra `json:"onpremiseInfraModel" validate:"required"`
    +	inframodel.OnpremiseInfraModel
    }
    • 관련 변경 사항 (struct embedding 적용하면 아래 처럼 활용됩니다. 어색할 수 있습니다..)
    -	sourceInfra := reqt.OnpremiseInfraModel
    +	sourceInfra := reqt.OnpremiseInfraModel.OnpremiseInfraModel

Honeybee, Damselfly 개선 및 테스트 완료 후, Honeybee, Damselfly, Beetle를 같이 릴리스 찍으면 될 것 같습니다.

@ish-hcc
Copy link
Member

ish-hcc commented Oct 24, 2024

@dev4unet @yunkon-kim

1. 모델 차이 개선

  • /source_group/{{sgId}}/infra/refined
  • /source_group/{{sgId}}/connection_info/{{connId}}/infra/refined

두 API에 대해서는 /source_group/{{sgId}}/infra/refined 에 맞추는 것으로 하겠습니다.

/source_group/{{sgId}}/connection_info/{{connId}}/infra/refined 를 조회하여도
/source_group/{{sgId}}/infra/refined 와 동일한 형태로 반환하며,
servers 부분에는 1개의 server에 대해서만 정보가 조회되는 형상이 될 것입니다.

{
  "network": {
    "ipv4Networks": [
      "172.26.240.0/20"
    ],
    "ipv6Networks": [
      "string"
    ]
  },
  "servers": [
    {
    } /// 1개만 존재
  ]
}

2. Beetle에서 Recommend 인프라를 제공하기 위한 Requst 관련

  • Spec이 CSP, Region 마다 제공되는 부분이 다르기 떄문에 두 정보에 대해서 입력을 받도록 개선이 된 것으로 파악하고 있습니다.
  • Web에서 CSP목록과 Region 목록을 선택하거나 입력을 받은 다음에 Beetle의 Recommend API로
    CSP, Region 정보를 포함하여 honeybee의 /source_group/{{sgId}}/infra/refined 에서 얻은 정보를 건네주는 형태가 될 것입니다.

3. 임시 API 삭제

사전에 말씀드린 것처럼 이제 /source_group/{{sgId}}/infra/refined/{{CSP}}/{{region}} API는 삭제하여 더이상 제공 되지 않습니다.
cm-model을 활용하여 1. 에서 말씀드린 것처럼 통일시키는 쪽으로 진행하겠습니다.

그 외에는 cm-model에 제시하여 주신대로 cm-honeybee에서의 모델 통일 작업을 하여 추진하는 방향으로 하겠습니다.

@dev4unet
Copy link
Member Author

dev4unet commented Oct 28, 2024

@ish-hcc @yunkon-kim
honeybee의 refined 응답에 정상적으로 onpremiseInfraModel 요소가 포함돼서 리턴되는 것을 확인했습니다.
"onpremiseInfraModel": {
"network": {},
"servers": []
}

세부적인 것은 좀 더 확인해 봐야겠지만 잠깐 API 위주로 테스트해 봤을 때 현재 honeybee, beetle, damselfly 모두 아래 형태로 통일된 것 같습니다.^^
"onpremiseInfraModel": {
"network": {},
"servers": []
}


참고로, 아래부터의 내용은 단순한 부연 설명겸 의견입니다.
개인적으로는 원하는 형태가 비슷한 것 같은데 @yunkon-kim님이 생각이 다르라고 의견 주신 서브시스템 간에 입출력을 동일에 대해 다시 부연 설명 드리면...
제가 요청드린 사용자(admin) 측면에서의 Input/Output 통일은, 제가 표현을 잘 못 했을지 모르겠으나 위에도 세부적으로 적었듯이 모든 시스템에 필요한 값들을 전부 통일 해달라는 요청이 아니라 시스템간의 의존성을 최소한으로 하기 위해 최소한의 Outline은 맞춰 달라는 요청으로서 지금처럼 Honeybee의 출력 정보에 onpremiseInfraModel 정보가 포함된 현재의 형태가 제가 원하는 형태입니다.
기존에는 onpremiseInfraModel 를 제외한 하위 정보만 리턴하고 있어서 api를 이용하는 사용자가 두 시스템간의 JSON 규격을 모르면 이용할 수 없는 형태였지만, 지금은 삭제된 API의 결과에서만 유일하게 onpremiseInfraModel 정보를 리턴했으나 불필요한 CSP와 리전 정보를 포함하고 있기에 CSP와 리전은 Honeybee의 영역이 아니니 해당 정보를 제외한 정보로 onpremiseInfraModel 요소가 필수면 onpremiseInfraModel 요소를 포함하고 필수가 아니면 두 시스템 모두 제거된 모델 스키마를 통일 해달라고 요청드렸으며 현재는 요청된 정보가 반영되어 있습니다.

Honeybee와 Beetle의 온프레미스 인프라 마이그레이션을 예를 들어 구체적으로 설명을 드리면,

  1. 입력 모델을 생성하는 Honeybee가 없었다면 사용자는 Beetle의 API 규격을 보고 필요한 모델 정보를 직접 입력하겠지만...
    Beetle의 입력이되는 정보를 생성하는 Honeybee가 있으며 Damselfly가 아닌 Honeybee가 입력 모델도 담당하므로 온프라미스 인프라 마이그레이션에 대해서는 Honeybee와 Beetle의 의존도는 상당히 높을 수 밖에 없으며 가급적 다른 시스템들까지 영향을 미치지 않았으면 하는 생각입니다.

  2. 당연히 목적이 다르기에 Beetle의 API에 따라서는 Honeybee가 Beetle이 필요로 하는 모든 값을 생성할 수 없지만 Honeybee는 Beetle의 기본 입력 정보 생성을 담당하기 때문에 Beetle이 필요로하는 인프라와 관련된 최소한의 물리적 정보들은 모두 생성해서 전달해야 합니다.
    개인적으로 이 최소한의 정보가 포함된 부분을 두 시스템간의 모델(스키마?)이라고 표현했으며, 이 스키마 구조의 변경에 따른 영향력을 최소화 하기 위해 API를 이용하는 사용자가 굳이 Honeybee와 Beetle만 사용하는 이 최소한의 정보가 담긴 JSON 모델의 스키마 구조까지 자세하게 알 필요 없이 사용자는 단순히 Honeybee가 생성해준 값에서의 수정 외에는 Beetle에 그대로 전달하면 충분하지 않나 싶습니다. <-- 이 최소한의 모델 정보에 Beetle이 요구하는 CSP를 포함한 모든 정보를 담아야한다는 의미가 아닙니다.
    즉, 기존에는 onpremiseInfraModel 요소가 없어서 기존처럼 Honey가 생성해준 값을 Beetle에 직접 전달할 수 없고 무조건 사용자가 onpremiseInfraModel라는 JSON Root 요소가 필요하다는 정보를 문서에서 찾아본 후 onpremiseInfraModel라는 루트 요소를 직접 추가해서 Beetle에 전달할 필요는 없다고 생각됩니다. <-- 만약, 기존처럼 이렇게 사용자가 직접 개입해야 될 경우 Honeybee를 이용하는 사용자(or 다른 시스템)도 모델 스키마의 의존성이 생기게되어서 지금은 onpremiseInfraModel이었는데 나중에 다른 이름이나 스펙이 바뀌면 함께 수정해야 합니다.

  3. Beetle의 /recommendation/mci에서 필요로 하는 desiredProvider와 desiredRegion처럼 Beetle에서는 위의 Honeybee가 생성해준 최소한의 모델 정보 외에 로직을 처리하기 위해 필요한 추가 정보가 있다면 해당 부분은 모델 보다는 Beetle의 추가 필요 정보이지 Honey가 생성할 모델 요소는 아니라고 생각합니다.
    이 부분에 대해서는 아래와 같은 "onpremiseInfraModel"이라고 가정할 때...
    "onpremiseInfraModel": {
    "network": {},
    "servers": []
    }
    Beetle이 필요로 하는 추가 정보는 아래와 같은 [타입1] 방식과 [타입2] 방식을 고려해 볼 수 있으리라 봅니다.(또는 혼합)
    [타입1]
    "onpremiseInfraModel": {
    추가요소1
    추가요소2

    "network": {},
    "servers": []
    }
    [타입2]
    추가요소1
    추가요소2

    "onpremiseInfraModel": {
    "network": {},
    "servers": []
    }
    [타입1]과 [타입2]의 차이는 Beetle이 필요로 하는 정보를 최소 모델 정보인 onpremiseInfraModel 요소의 안쪽에 넣어서 전달해야 할지 onpremiseInfraModel 요소에 영향을 받지 않도록 바깥쪽에 넣어서 전달할지입니다.
    개인적으로 이 부분도 2.와 같은 맥락으로 시스템간의 의존성을 최대한으로 줄이려면 onpremiseInfraModel의 존재를 반드시 알아야 하는 [타입1] 보다는 모델 정보에 대해서는 전혀 신경 쓰지 않아도되는 [타입2] 형태로 처리되는 것이 사용자의 개입이 적을 것으로 판단되며, [타입2]의 추가요소 부분을 [타입2]와 같은 1개의 완전한 JSON으로 전달하든, 추가 요소 부분만을 Parameter로 전달 하든...
    해당 데이터가 필요한 시스템(Beetle)의 요구 사항을 따라가면 될 것 같으며 시스템 의존성도 최소화되지 않을까 싶습니다.
    즉, 위 방식을 굳이 따지면..
    param1, parma2, jsondata(최소한의 모델정보) 처럼 3개의 각각의 변수처럼 독립적으로 받아서 처리되는 형태라고 이해하면 이해가 쉬울 것 같습니다.

    그렇게 할 경우 jsondata(가칭) 변수는 사용자 입장에서는 honeybee가 준 정보를 고스란히 beetle에 bypass하는 용도 외에는 없기 때문에 honeybee가 필요로 하는 인프라 모델 정보의 규격이 바뀌어야 할 경우(예:특정 인프라 정보 추가나 삭제 또는 구조 변경이나 모델 버전 도입 등) 두 시스템간의 jsondata 규격만 변경하면 되기에 수정이나 관리가 필요할 경우에도 사용자의 기존 소스 수정 없이 연관된 시스템들끼리만 조율하면됩니다.
    API를 이용하는 사용자는 jsondata의 변경은 무시하고 서비스를 제공하는 api의 부득이한 변경에 따른 다른 부분만 신경(예:api 명칭이나 파라메터 변경 등) 쓰면 되기 때문에 나중에 두 시스템 간의 모델 스펙이 바뀌어도 수정되는 범위가 최소화될 것으로 판단됩니다.

정답은 없기에 Honeybee에서 onpremiseInfraModel 이름이 포함된 구조를 반드시 리턴해야 할 필요는 없겠지만 개인적으로는 위처럼 연계된 시스템간의 규격은 해당 시스템들만 사용하는 별도의 규격으로 정해서 값 수정을 제외한 변경은 사용자의 간섭으로부터 격리 시키고, 개별 시스템에서 추가로 필요한 부가 정보를 별도로 받는 형태로 분리되는 방식이 조금 더 유연하게 처리가 가능하지 않을까 싶습니다.

즉, API를 이용하는 입장에서는 두 시스템의 의존성이 높은 모델 규격에 대해서는 독립된 변수처럼 별도의 스키마로 정의되고 필요한 정보들은 해당 스키마와 무관하게 전달 받아서 onpremiseInfraModel 부분의 명칭이 onpremiseInfra로 바뀌든 onpremiseInfraModel 내부에 버전 제도가 도입되어서 버전 간의 상호 호환성을 유지하든 honeybee와 beetle을 이용하는 사용자는 적어도 두 시스템에만 의존 관계가 있는 부분에 대해서는 최대한 신경 쓸 필요가 없고 다른 시스템들의 API도 비슷한 방식으로 제공하는 방향이 좋지 않을까 생각해 봅니다.
현재 최종 반영된 Honeybee와 Beetle의 경우 비슷한 형태로 반영되었다고 판단됩니다.

@dev4unet
Copy link
Member Author

@ish-hcc 최신 버전으로 테스트해 봤는데 Coonnection 정보의 Port가 암호화 되어서 조회되고 있습니다.
Port 정보는 복호화해서 내려 주세요^^

@yunkon-kim
Copy link
Member

yunkon-kim commented Oct 28, 2024

@dev4unet

엄청난 글을 작성해주셨네요;; 혹시나 잘못 이해하는 부분이 있을까 하여 몇 차례 읽어 보았습니다.

그런데, 아직 생각이 다른 부분이 있다고 느껴져 의견을 말씀드립니다.

현재 제 생각으로는, _사용자(Admin)_가 서브시스템의 API docs를 살펴본 후, 이를 사용하는 Actor는 아니라고 생각합니다. _사용자(Admin)_는 만들어진 Cloud-Migrator Platform WebConsole을 이용해서 마이그레이션을 수행하게 될 것이라고 생각합니다. (물론 이에 대해 정해진 바는 없습니다.)

한편, 서브시스템 API docs에서 API 규격을 파악한 후, 이를 활용하는 Actor는 _개발자_라고 생각됩니다. 예를 들어, Platform을 개발하고 있는 우리 Maintainer/Contributor 분들이 될 수 있겠습니다.

그렇기에, 빠르게 맞춰드리는 것이 좋겠다고 판단하였고, 바로 "모델명:모델"로 스키마를 변경해드린 상태 입니다.

다만, "모델명:모델"이 Honeybee와 Beetle 등의 서브시스템 API의 속성 값으로 들어갈 수 있으나, API간 입출력이 동일할 수 없을 것이라는 의견을 드렸던 것 입니다. 설명해 주신 내용을 제가 잘 이해했다면 API간 입출력 자체가 동일하지 않다는 것은 합의점을 찾은 것 같습니다.


( 1번 관련)

다른 서브시스템에 영향이 가지 않으면 좋겠다는 의견을 주셨기에 당분간 새로운 모델을 정의 시 "모델명:모델"으로 맞춰서 제공해드리는 방향으로 진행하겠습니다.

다만, "모델"만 제공하는 것과, "모델명:모델"로 제공하는 것이 다른 시스템에 주는 영향이 그다지 크지 않을 것으로 판단되며, "모델명"이 명시된다면 이로 인한 강결합성을 갖게되고, 모든 서브시스템간에 동기화를 강제하는 부분이될 것 입니다.

또한, 모델이 세분화 되거나 다양한 형태로 제공되기 시작했을 때, 상위 서브시스템에서 구분 및 Handling 해야할 API/모델이 늘어나게 될 것으로 예상해 볼 수 있습니다.

모델이 하나인 지금은 이대로 추진하고요. 추후 모델이 늘어났을 때 현황 및 방안을 공유드리겠습니다.

소스 모델의 개발 및 적용 순서를 설명 드립니다. 참고하시면 될 것 같습니다.
Honeybee 소스 컴퓨팅 형상 정보 제공 > Damselfly (cm-model) 소스 모델(onpremiseModel) 규격 정의 > Honeybee 소스 모델 규격 반영 및 API 제공 (GET refined/infra) > Beetle 추천 API에 소스 모델 규격 반영 (+provider, region)


( 2번 관련)

위에서 말씀드린 사용자에 대한 견해 차이로 설명을 대신하도록 하겠습니다.


(3번 관련)

실제 대상을 분석하여 모델을 도출하는 것을 가정하면, [타입 2]가 더 적절하다는 것에 동의합니다.


마지막으로, 모델은 Honeybee, Beetle 이외에도 여러 시스템에 연관되기 때문에 관련된 모든 서브시스템에 동기화가 필요할 것으로 보이네요.

관련되는 서브시스템들은 아래 링크의 "통합 주요 기능 및 관계도"를 참고하시면 될 것 같습니다.
: cloud-barista/cloud-migrator#11

@dev4unet
Copy link
Member Author

Port 정보 정상적으로 복호화된 것 확인했습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants