[ConoHa API] Java Script로 서버 목록을 얻습니다.

서버 상세 정보 얻기



이전까지는 servers API를 사용했지만 이번에는 servers/detail API를 사용합니다.
//
// servers detail API information
//
var servers_detail_url = "https://compute.tyo1.conoha.io/v2/" + tenant_id + "/servers/detail";
var servers_detail_data = {};
var servers_detail_type = "GET";
var serversDetailOnSuccess = function(data) {
  for (var i = 0; i < data.servers.length; i++) {
    var tr = $('<tr>');
    var td_index = $('<td>').text(i);
    var td_status = $('<td>').text(data.servers[i].status);
    var td_name = $('<td>').text(data.servers[i].metadata.instance_name_tag);
    tr.append(td_index).append(td_status).append(td_name);
    $('#server_table').append(tr);
  }
}

기본적인 사용법은 servers API를 동일하네요. 전원 상태는 status이고 이름 태그는 metadata.instance_name_tag에서 얻을 수 있습니다.

작동하는 코드는 여기에 있습니다.

다중 리전의 서버 정보 획득



그런데, 지금까지는 도쿄 리전의 정보를 취득하고 있었습니다만, 싱가포르와 미국의 서버 정보도 취득해 봅시다.

우선 싱가포르와 미국에 서버를 세워 API를 두드리면… 도쿄밖에 취득할 수 없네요. 게다가 리전 정보는 도대체 어디에 격납되어 돌아오는 것일 것이다. . .

라고, 소일시간 고민하고 있었던 곳 원래 API의 URL이 다르다는 것을 깨달았습니다. API Documentation에는 쓰여지지 않은 것 같습니다만, 자신의 계정으로 로그인 --> API --> 엔드포인트에서 리전 마다의 URL이 기재되어 있군요.

기본적으로 URL은 다음의 구성으로 되어 있는 것 같습니다.
http://[type].[region].conoha.io/hogehoge

각 지역의 대응은 다음과 같습니다.


지역
URL


도쿄
tyo1

싱가포르
sin1

미국
sjc1


미국은 새너제이에 서버가 있습니까?

여러 지역에 대한 대응



URL이 다르기 때문에 지금까지의 방법을 조금 바꾸지 않으면 안 되었습니다.

우선은 리전과 URL의 대응을 연상 배열로 정의합니다. 연상 배열을 사용하고 있는 것은 나중에 for 루프로 빙글빙글 돌릴 수 있을까라는 논의입니다.
//
// Region
//
var regions = {
  "Tokyo"     : "tyo1",
  "Singapore" : "sin1",
  "US"        : "sjc1"
};

또, 토큰의 저장처도 다음과 같이 합니다.
window.localStorage['token_Tokyo'];
window.localStorage['token_Singapore'];
window.localStorage['token_US'];


그런 다음 각 API의 URL을 변수에서 함수로 변경합니다. region을 인수로 사용하여 지역별 URL을 생성합니다.
var getTokenUrl = function(region) {
  return "https://identity." + region + ".conoha.io/v2.0/tokens";
} 
var getServersDetailUrl = function (region){ 
  return "https://compute." + region + ".conoha.io/v2/" + tenant_id + "/servers/detail";
};

이제 토큰 API success를 처리할 때 리전별로 토큰을 저장할 위치를 전환해야 합니다. 그렇다고 해서 지역별 함수를 만들고 싶지 않습니다.

다행히 $.ajax는 success, error등의 처리에 this로서 임의의 값을 건네주는 context라는 파라미터가 존재합니다.
var access = function(url, data, type, onSuccess, key) {
    return $.ajax({
      url: url,
      data: JSON.stringify(data),
      type: type,
      headers: {
        'X-Auth-Token' : window.localStorage["token_" + key]
      },
      context: key,
      success: onSuccess,
      error: function() {
        console.log('$.ajax error. remove token in local storage.');
        window.localStorage.removeItem("token_" + key);
      }
    });
}

access 함수에 key (= Tokyo, Singapore, US 중 하나의 문자열이 들어 있음)를 전달하고이를 컨텍스트에 넣습니다. 이렇게하면 success에서 this를 사용하여 값을 검색 할 수 있습니다.
var tokenOnSuccess = function(data) {
  window.localStorage["token_" + this] = data.access.token.id;
}

마지막으로 access를 호출하는 부분을 변경합니다. 예상대로 for 루프로 빙빙 돌립니다.
  for (key in regions) {
    if (window.localStorage["token_" + key] === undefined) {
      access(getTokenUrl(regions[key]), token_data, token_type, tokenOnSuccess, key).done(function(){
        access(getServersDetailUrl(regions[this]), servers_detail_data, servers_detail_type, serversDetailOnSuccess, this); 
      });
    } else {
      access(getServersDetailUrl(regions[key]), servers_detail_data, servers_detail_type, serversDetailOnSuccess, key); 
    }
  }

조심해야 하는 것은 .done() 에서 키를 인수로 전달해서는 안 된다는 것입니다. 예를 들어 도쿄 토큰 액세스 중에 for 루프 처리가 진행되어 US까지 돌았다고 가정합니다. 그 후, 도쿄의 done에서 key에 액세스하면 key의 값은 US가 됩니다.

그래서 앞서 context에서 설정한 this에 저장된 key의 값을 사용합니다.

이상, 길었습니다만 아래와 같이 무사 각 리전의 서버 정보를 취득할 수 있었습니다!



작동하는 코드는 여기에 있습니다.

다음 번



다음은 드디어 PhoneGap을 사용하여 스마트 폰에서 움직입니다.

좋은 웹페이지 즐겨찾기