OpenStack2015.01.28 00:17

안녕하세요~!!


요즘들어 제가 많이 부족하다는 생각이 듭니다.

처음 책을 쓸때는 좋은 마음으로 썼는데, 좀 더 꼼꼼하게 체크하고 검토했어야 했는데,...

마음만 급해서 제대로 신경을 쓰지 못했다는 생각이 많이 듭니다. 물론 밤 늦게 작업하고 피곤한 가운데 집필을 하다보니 생각지도 못한 오류들이 많이 발생했던 것 같습니다. 나중에는 내용이 너무 많아서 그냥 대충 보고 넘어간 부분도 없지 않아 있었던 것 같습니다. 그래서, 책을 구매해 주신 분들에게 한편으로는 너무 미안한 마음이 듭니다. 


그리고, 제가 숫자하고 별로 친하지 않다는것은 이미 알고 있었지만, 확실하게 숫자 계산하고는 친하지 않다는것은 한번 더 알았습니다. ㅠㅠ 


지금까지 오류나 오타에 대한 부분들을 알려주신 분들께 정말 진심으로 감사드립니다. 그리고, 이를 통해서 저 또한 발전하는 것 같습니다. 그리고, 다음에는 정말 더 꼼꼼해져야 되겠다는 생각을 더욱더 많이 했습니다.


책을 내고 문의가 많이 들어오는데, 해당 문의들에 대한 답변을 제가 다 해 드릴수가 없습니다.

이미 6개월전에 설치해 보고 지금 제게 장비는 사라지고 없습니다. 

테스트 해 볼 장비가 없어서 잘 기억이 나지 않는 부분도 솔직히 말해서 있습니다.

버철박스 뛰워서 테스트해 보는것도 한계가 있습니다. 힘드네요~~~ 

더군다나 요새는 그럴 시간조차 없습니다.

제대로 답변 안준다고 맘 상해 계시는 분들 분명히 계실꺼라 생각하는데, 

어디선가 저 원망하고 계시는 분들 반드시 있을 꺼라 생각하는데,

조금만 이해해 주시면 정말 감사하겠습니다. 


그래서, 오늘은 CentOS 6.5에서 OpenStack Swift 설치 매뉴얼을 공개할까 합니다. 

늘 우분투에서만 설치를 해 봐서 CentOS에서도 설치를 한번 해 보고 싶었습니다.

그리고, 몇년전에 공개한 매뉴얼에서 바뀐 부분도 있고 해서 이번에 설치를 하게 되었습니다.


서비스를 위한 매뉴얼은 아닙니다. 단지 테스트를 위한 스터디를 위한 매뉴얼입니다.

장비가 없어서 서버 한대에 모두 돌려보는 그런 매뉴얼입니다.

많은 분들에게 도움이 되었으면 좋겠네요~!! 

참 따라하실때 IP 똑같이 할려고 애 쓰시는 분들 계시는데 그럴 필요 없습니다. 

좀 더 쉽게 이해하시라고 영문 설명 대신 IP를 넣었습니다.


OpenStack Swift on CentOS 6 Installation Manual.pdf



*** 혹시라도 이 글을 읽고 장비를 지원해 주어야겠다 라는 생각이 드시는 분 절대 완전 환영합니다. 연락주십시요.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.12.21 15:40

오늘은 예전에 Devstack Shell Script를 이용해서 살알짝 수정했었던 Swift Install Shell Script를 여러분들께 공개할까 합니다.

테스트나 스터디용으로 만든 버전이라서 혼자 가지고 있는것보다는 같이 공유해서 보면 좋을 것 같다는 생각을 했습니다. 보시다가 더 좋은 아이디어가 있다면 역시 서로서로 공유할 수 있는 아름다운 사회 문화를 만들어 봅시다. ^^



DevStack Shell Script를 보면 Openstack의 

- Compute Service인 Nova 뿐만 아니라 

- Image Service인 Glance, 

- Object Storage인 Swift, 

- Network Service인 Quantum, 

- Volume Storage 인 Cinder, 

- Web Service인 Horizon,

- Auth Service인 Keystone 

등 모든 것을 전부 다 설치할 수 있도록 지원해 준다.



그런데 이중에서 단독으로 따로 떨어져 나와 독단적으로 구성할 수 있는 것이 있는데 그것이 바로 Object Storage인 Swift이다.

Swift가 다른 OpenStack과 함께 설치가 되면 Glance를 통해 이미지를 저장할 수 있는 저장소로 쓰이지만, 따로 구성했을 경우에서는 클라우드 스토리지로 사용할 수 있다.


예전에 테스트로 DevStack Shell Script를 분석하면서 Swift만 따로 구성할 수 있는 Script를 만들면 좋을 것 같아 테스트 삼아 한번 수정해 본것이 있는데 그동안 시간이 안되서 포스팅을 못하고 있었다. 오늘 잠시 시간이 되어 포스팅을 한번 해 볼까 한다.


요즘에 다운로드 받는 DevStack Shell Script를 보면 Part별로 소스가 전부 나누어져 개발되어 있는 것을 볼 수 있다. 전에는 거의 한 소스에 전부 모여 있는 것들이 Part별로 나누어져 숨어 있어 한번 더 소스를 찾아가야 하는 번거로움이 있지만, 소스를 수정할 때나 업무를 분담할때는 오히려 더 좋을 수도 있겠다는 생각이 든다.


그런데, 내가 수정했던 DevStack Shell Script는 좀 오래 된 몇개월 된 버전에서 수정했다는 사실이다.

테스트로 만들어본 GitHub 계정에 올려 놓았으니 테스트로 공부를 해 보고 싶으신 분들에 한에서 다운로드 받아 설치해볼수 있다. 그러나, 절대로 시스템 구축시에는 사용할 수 없다~~~~!!!!


https://github.com/naleeJang/devstack-swift


저작자 표시 비영리 변경 금지
신고

'OpenStack' 카테고리의 다른 글

OpenStack! 그 시장의 가치는?  (1) 2013.01.11
Keystone 명령어 테이블  (0) 2013.01.04
Openstack Swift Install Shell Script  (2) 2012.12.21
Cinder 명령어로 볼륨 생성하기  (0) 2012.12.13
Chef 명령어 정리  (0) 2012.12.07
Ubuntu에서 Ubuntu Instance로 접속할 때~!!  (7) 2012.11.21
Posted by 나리 짱!!! naleejang
OpenStack2012.06.28 19:34

안녕하세요~!!

오랜만에 블로그에 글을 올리는 것 같습니다. 그동안 너무 바뻐서, 글을 쓸 시간도 없었던거 같습니다.


오늘은 OpenStack Swift의 Ring 구조에 대해 살펴보도록 하겠습니다. 

그리고, 그동안 연구했던 Swift의 구조 및 Ring 구조를 그림으로 표현해 보았습니다.


Ring은 아래 그림과 같은 구조로 구성이 되어 있으며, Proxy Node에서 swift-ring-builder 명령어에 의해 생성 및 정의되어 각 Storage Node들로 복사가 됩니다. Ring Builder 파일에는 build version, partition count, replica count, zone count, device count 등의 내용이 요약되어 있습니다.

 

ID : 디바이스를 구분하기 위한 번호

Zone Number : 해당하는 Zone  Number

IP : 해당하는 Storage Node IP 주소

Port : 해당하는 Storage Node Port 주소

(Account-Server : 6002, Container-Server : 6001, Object-Server : 6000)

Device Name : 해당하는 Storage Node의 접근한 폴더 이름

Weight : 디바이스의 비중

Meta : 디바이스에 추가적으로 입력할 내용





저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
Java2012.03.06 15:05
Java에서 Rest API로 가장 많이 사용하는 것은 Apache CXF이다. CXF는 Server모듈을 만들수 있고, 쉽게 client 프로그래밍을 할 수 있다. 그런데 Java가 아닌 다른 언어로 제공되는 Rest를 사용할 경우, 다른 서버의 url을 바로 호출할 경우 사용 할수 있는 것이 바로  HttpClient이다.

HttpClient 객체에는 HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete가 있는데, 이 메소드들은 Android에서도 많이 사용되고 있는 통신 방법이다. 어떻게 보면 CXF Restful과도 같아 보인다.

- HttpGet : 데이터를 조회할 때 주로 사용한다.
- HttpHead : 조회하고자 하는 데이터의 메타데이터나 인증정보, 혹은 세션값을 확인 할 때 사용한다.
- HttpPost : 데이터의 메타데이터 등을 수정할 때 사용한다.
- HttpPut : 새로운 데이터를 생성할 때 사용한다.
- HttpDelete : 데이터 삭제시 사용하는 메소드이다.
 
그럼 이제 OpenStack Swift Client Java API 예제와 함께 자주 사용하는 HttpClient 메소드들을 알아보도록 하자.

** 아래 예제 샘플은  http://wiki.openstack.org/SwiftAPI 에 가면 다운로드 받을 수 있다.




HttpGet 

/**
 로그인된 Account의 Container 리스트를 조회하는 메소드로 HttpGet을 사용하였다.
*/

public List<FilesContainer> listContainers(int limit, String marker) throws IOException, HttpException, FilesException

{
        //로그인이 되었는지를 체크한다. 

if (!this.isLoggedin()) {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

HttpGet method = null;

try {

LinkedList<NameValuePair> parameters = new LinkedList<NameValuePair>();

    if(limit > 0) {
                        //파라메터로 받은 limit를 추가한다. 

parameters.add(new BasicNameValuePair("limit", String.valueOf(limit)));

}

    if(marker != null) {
                        //파라메터로 받은 marker를 추가한다.  

parameters.add(new BasicNameValuePair("marker", marker));

}

    //위에서 생성한 parameters는 URI를 생성할때 사용이 된다.

    String uri = parameters.size() > 0 ? makeURI(storageURL, parameters) : storageURL;
                //위에서 선언한 HttpGet 객체를 생성한다.

method = new HttpGet(uri);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);
                //헤더에 인증 Token를 추가한다.  

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                
                //여기서 사용되는 FilesResponse는  HttpClient로 실행한 결과값을 담아놓는 HttpResponse로 보                    면 된다.

FilesResponse response = new FilesResponse(client.execute(method));

    if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

//상태코드가 401로 인증되지 않았을 경우 

}

if (response.getStatusCode() == HttpStatus.SC_OK)

{

//상태코드가 200으로 성공했을 경우

}

else if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

{

//상태코드 204 로 새로운 정보가 없을 경우

}

else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND)

{

//상태코드가 404 Not Found가 나왔을 경우

}

else {

//응답코드가 없을 경우

}

}

catch (Exception ex) {

ex.printStackTrace();

throw new FilesException("Unexpected error, probably parsing Server XML", ex);

}

finally {

if (method != null) method.abort();

}

} 


HttpHead

 /**
 로그인된 Account의 MetaData 정보를 조회할 때 HttpHead를 사용하였다.
*/ 
public FilesAccountInfo getAccountInfo() throws IOException, HttpException, FilesAuthorizationException, FilesException

{
        //로그인이 되었을 경우에만 아래 프로세스를 수행한다. 

if (this.isLoggedin()) {

HttpHead method = null;


try {

method = new HttpHead(storageURL);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                        //해당 storageURL의 MetaData를 조회한다.

FilesResponse response = new FilesResponse(client.execute(method));
 

if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
                                //401 인증이 되지 않았을경우 Header를 삭제하고 다시 로그인을 한다.

method.removeHeaders(FilesConstants.X_AUTH_TOKEN);

if(login()) {

method.abort();

method = new HttpHead(storageURL);

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                                        //다시 해당 storageURL의 MetaData를 조회한다. 

response = new FilesResponse(client.execute(method));

}

else {
                                        //인증이 되지 않으면 오류처리한다. 

throw new FilesAuthorizationException("Re-login failed", response.getResponseHeaders(), response.getStatusLine());

}

}

                        // 기존 정보와 변동이 없으면 기존 정보를 조회하여 리턴한다. 

if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

{

int nContainers = response.getAccountContainerCount();

long totalSize  = response.getAccountBytesUsed();

return new FilesAccountInfo(totalSize,nContainers);

}

else {

throw new FilesException("Unexpected return from server", response.getResponseHeaders(), response.getStatusLine());

}

}

finally {

if (method != null) method.abort();

}

}

else {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

}


HttpPost

 /**
 Object Metadata 정보를 수정할 때 HttpPost를 사용한다.
*/  
public boolean updateObjectMetadataAndManifest(String container, String object, 

Map<String,String> metadata, String manifest) throws FilesAuthorizationException, 

HttpException, IOException, FilesInvalidNameException {

        FilesResponse response;

        //로그인이 되어 있는지 체크한다.

if (!isLoggedin) {

    throw new FilesAuthorizationException("You must be logged in", 

    null, null);

}
        //수정될 Container가 있는지 체크한다. 

if (!isValidContainerName(container))

throw new FilesInvalidNameException(container);     
 
       //수정될 Object가 있는지 체크한다.

if (!isValidObjectName(object))

           throw new FilesInvalidNameException(object);


//Post 될 Url를 생성한다.

String postUrl = storageURL + "/"+FilesClient.sanitizeForURI(container) +

"/"+FilesClient.sanitizeForURI(object);

HttpPost method = null;

try {

          method = new HttpPost(postUrl);

        if (manifest != null){

        method.setHeader(FilesConstants.MANIFEST_HEADER, manifest);

        }

  method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                //HttpPost에 파라메터, 헤더, metadata값을 추가한다. 

  if (!(metadata == null || metadata.isEmpty())) {

  for(String key:metadata.keySet())

  method.setHeader(FilesConstants.X_OBJECT_META+key, 

  FilesClient.sanitizeForURI(metadata.get(key)));

  }
                //HttpPost를 HttpClient로 실행한다. 

HttpResponse resp = client.execute(method);

response = new FilesResponse(resp);

if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
                        //인증이 되지 않았으면 처음부터 다시 실행한다. 

method.abort(); 

if(login()) {

method = new HttpPost(postUrl);

  method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);

  if (!(metadata == null || metadata.isEmpty())) {

  for(String key:metadata.keySet())

  method.setHeader(FilesConstants.X_OBJECT_META+key, 

  FilesClient.sanitizeForURI(metadata.get(key)));

  }

    client.execute(method);

}

}

return true;

} finally {

if (method != null) 

method.abort();

}

}


HttpPut

 /**
 Container를 생성할 때 HttpPut 메소드를 사용한다.
*/   
public void createContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesException

{
        //우선 로그인이 되었는지 먼저 체크한다. 

if (this.isLoggedin())

{
                //생성가능한 container명인지 체크한다. 

if (isValidContainerName(name))

{
                        //해당 storageUrl로 container 생성을 요청할 준비를 한다.

HttpPut method = new HttpPut(storageURL+"/"+sanitizeForURI(name));

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);

try {
                                // 준비된 요청을 실행한다.

FilesResponse response = new FilesResponse(client.execute(method));    

              if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

              // 402 인증이 안되었을 경우

            }


          if (response.getStatusCode() == HttpStatus.SC_CREATED)

         {
                                        //  201 Container 생성 성공

          return;

         }

         else if (response.getStatusCode() == HttpStatus.SC_ACCEPTED)

         {

         // 202 이미 Container가 있을 경우

         }

         else {

        // 기타는 에러로 간주

         }

}

finally {

method.abort();

}

}

else

{

throw new FilesInvalidNameException(name);

}

}

else {

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

}



HttpDelete

  /**
 Container를 삭제할 때 HttpDelete 메소드를 사용한다.
*/  
public boolean deleteContainer(String name) throws IOException, HttpException, FilesAuthorizationException, FilesInvalidNameException, FilesNotFoundException, FilesContainerNotEmptyException

{
        //로그인이 되었는지 체크한다. 

if (this.isLoggedin())

{
                //삭제 가능한 Container명인지 체크한다. 

if (isValidContainerName(name))

{
                        // 해당 storageURL로 container를 삭제할 준비를 한다. 

HttpDelete method = new HttpDelete(storageURL+"/"+sanitizeForURI(name));

try {

method.getParams().setIntParameter("http.socket.timeout", connectionTimeOut);

  method.setHeader(FilesConstants.X_AUTH_TOKEN, authToken);
                                // 준비된 요청을 실행한다.

        FilesResponse response = new FilesResponse(client.execute(method));


          if (response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {

        // 402 인증이 안되었을 경우 

        }


          if (response.getStatusCode() == HttpStatus.SC_NO_CONTENT)

       {

       // container가 삭제되었다.

         return true;

       }

       else if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND)

       {
                           //삭제 할 container가 없을 경우 

       logger.debug ("Container does not exist !");

       

       }

       else if (response.getStatusCode() == HttpStatus.SC_CONFLICT)

       {
                           //삭제 할 container가 empty가 아닐 경우 에러를 발생한다.

       logger.debug ("Container is not empty, can not delete a none empty container !");

       }

}

finally {

method.abort();

}

}

else

{

        throw new FilesInvalidNameException(name);

}

}

else

{

    throw new FilesAuthorizationException("You must be logged in", null, null);

}

return false;

}


 
저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.02.27 10:34
Swift를 설치한 후 실행해서 Swift 정보를 확인할 수 있는 기본 명령어 혹은 API에 대해서 알아보도록 하겠다.

OpenStack Swift를 설치하면 우리가 알아볼 수 없는 저게 파일인가 폴더인가 뭔지 모르는 구조의 폴더구조가 생성된다. 단지 내가 생성한 디렉토리가 내가 업로드한 파일이 제대로 올라가 있는지 생성되었는지 확인을 하기 위해서는 다음과 같은 swift 명령어를 이용하여야만 한다.

우선 swift를 설치할때 account를 관리하기 위하여 swauth를 설치하였을 것이다.

account를 관리하기 위한 명령어 몇가지를 알아보도록 하자 

- Account List를 확인하는 명령어

swauth-list -A http://localhost:8080/auth/ -K swauthkey

 
 - 다음과 같은 결과가 나온다.

{"accounts": [{"name": "admin"}, {"name": "system"}, {"name": "test"}, {"name": "user"}]}  


- 그럼 특정 Account의 User List를 알아보자

swauth-list -A http://localhost:8080/auth/ -K swauthkey user


- User List를 조회하면 해당 User 정보가 출력된다.

{"services": {"storage": {"default": "local", "local": "http://localhost:8080/v1/AUTH_9799a70b-d58a-46ba-8f5a-98ac905b543d"}}, "account_id": "AUTH_9799a70b-d58a-46ba-8f5a-98ac905b543d", "users": [{"name": 
"nalee"}, {"name": "naleejang"}]}
 


-그럼 Account를 추가할 때는 어떻게 해야 할까? 다음과 같은 명령을 사용하면 된다.

swauth-add-user -K key -A http://localhost:8080/auth/ -a <account> 


- Account를 추가했으면 이번에는 Account에 User를 추가해보자.

swauth-add-user -K key -A http://localhost:8080/auth/ -a <account> <user id> <user pass>


- User도 추가했으니 User의 상태를 한번 확인해 보자.

swift -A http://localhost:8080/auth/v1.0 -U user:naleejang -K testpass stat


- 위와 같이 입력하면 다음과 같은 결과를 확인할 수 있다.

    Account: AUTH_9799a70b-d58a-46ba-8f5a-98ac905b543d

Containers: 3094

    Objects: 5

      Bytes: 45582768

Accept-Ranges: bytes



여기까지 Account 정보를 알아보는 명령어를 살펴보았다. 다음 시간에는 Container 정보를 확인해 보는 명령어를 알아보도록 하겠다.

저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.02.24 18:36

2월 23일 상암 누리꿈스퀘어(NIPA 소프트웨어공학센터)에서 "안드로이드 & 클라우드"를 주제로

유명환 뻔뻔강사님과 함께 세미나를 하였다.


나는 클라우드와 오픈스택이라는 주제로 세미나를 하였는데, 첫 세미나라서,..
부족한 부분이 많았을덴데 많은 것들을 보여 줄 수 없어서 조금 아쉬웠다. 

아무튼 내게는 더없이 좋은 경험이였고, 재미있는 강연이 될 수 있도록 노력했기에 듣는 분들도 만족했으리라
생각한다. ^^





저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.02.10 15:19
오늘은 OpenStack Swift의 DB 구조에 대하여 알아보도록 하겠다.

OpenStack의 Swift는 mysql과 같은 DB를 사용하지 않는다. 다만 SQLite3라고 하는 경량화 된 DB를 사용한다. 
그럼 Swift에는 어떤 Table들이 있을까? 정말 궁금하기 그지 없다. 소스를 까보지 않는 한 Swift Directory 구조를 살펴보지 않는 한 알수가 없다. 그래서, 내가 살펴 본 Swift의 DB 구조를 이곳에 공개하려 한다.

Table List
우선 Table List 부터 알아보도록 하겠다.

Swift에는 Account, Container, Object로 이루어져 있다. 그래서 DB Table또한 Account Table, Container Table, Object Data로 이루어져 있다.


OpenStack Table List


저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.02.02 10:45

지난 2011년에 OpenStack Swift를 설치하면서 정보를 서로 공유를 하는것이 좋다고 생각을 했다. 그리고, 아무도 하지 않은 설치 매뉴얼을 작성해서, OpenStack Korea Community와 공유를 하였다.

여기에서도 OpenStack Swift 설치 매뉴얼을 받아볼 수 있도록 공유를 하려고 한다.

VirtualBox를 활용한 OpenStack Swift SAIO 설치 매뉴얼



OpenStack Swift Multi Server 설치 매뉴얼

 

 
저작자 표시 비영리 변경 금지
신고
Posted by 나리 짱!!! naleejang
OpenStack2012.01.26 17:54
======================================================================
 Download API Site
======================================================================

http://wiki.openstack.org/SwiftAPI

======================================================================
 API Summary
======================================================================
 
내가 가지고 있는 내 로컬 PC의 디렉토리를 관리하는 것이 아니라,
원격에 있는 디렉토리 서버에 접속(Http 프로토롤 사용)을 해서 사용자 계정으로 로그인하고
그 사용자가 가지고 있는 디렉토리를 관리한다.

우리는 프로그래밍할때 다운로드 받은 소스를 Ant로 빌드한다.
그러면 java-cloudfiles.jar 파일이 생성된다. 
이 jar 파일을 개발할때 import시키고 개발하면 된다.
 
======================================================================
 Command Help 
======================================================================
get                               List the containers for this account 
: 로그인한 사용자 계정의 컨테이너(즉 디렉토리) 리스트 조회
get container                     List the contents of the given container
: 선택한 혹은 주어진 컨테이너의 컨텐츠 리스트 조회
get container/object destination  Download the given object and store it at the destination
: 선택한 객체(즉 데이터)를 다운로드하고 선택한곳(저장소)에 다운받은 파일을 저장한다.
head                              Get information about this account
: 로그인한 사용자 계정에 대한 정보 조회
head container                    Get the container's information
: 컨테이너(디렉토리) 정보 조회
head container/object             Get the objects's information and metadata
: 객체(파일)의 정보와 메타데이터(속성정보) 조회
put container                     Create the given container
: 컨테이너(디렉토리)를 생성한다.
put container localfile           Upload the local file to the container
: 컨테이너(디렉토리)에 내 PC에 있는 로컬파일을 업로드한다.
delete container                  Delete the container
: 컨테이너를 삭제한다.
delete container/object           Delete the given object
: 객체(파일)을 삭제한다.
help                              Print this help message
: Help 메시지를 출력한다.
exit                              Exit the program
: 프로그램을 빠져나간다.


======================================================================
 OpenStack Process 분석 (FilesCli.java)
======================================================================

1. UserName과 Password로 Cloud 사이트에 로그인한다.
   
   이때 cloudfiles.properties 파일에서 Cloud사이트를 정보를 가져오는데, 
   auth_url=https://auth.api.rackspacecloud.com/v1.0  로 되어 있다.
   우리는 rackspacecloud.com에 가입이 되어 있지 않아 본 프로그램을 테스트 하지 못했지만
   OpenStack를 설치하고 해당 Server로 접속을 하면 될 듯하다.

로그인에는 두가지 방법이 있는데, 
1.1 하나는 사용자로부터 ID와 PW를 받아 로그인하는 방법이고
1.2 다른 하나는 properties파일에서 ID와 PW 정보를 읽어와 로그인하는 방법이 있다.
2. 로그인을 성공하고 나면 다음과 같은 정보를 조회해 온다.
- storageURL  (저장 Path)
- authToken (인증 토큰)
- cdnManagementURL (관리페이지URL)
- ConnectionManager (메니저 객체)

3. 사용자가 보낸 명령어순대로 명령을 처리한다.
- help 
 : 위에 있는 help String을 화면에 뿌려준다.
- exit or quit 
 : 프로그램을 종료한다.
- get 
 : 컨테이너 리스트를 조회해 화면에 컨테이너명을 출력해 준다.
- get <container name>
 : 컨테이너의 컨텐츠 리스트를 조회해 화면에 출력해 준다. 없으면 empty라고 출력한다.
- get <object name>
 : 객체(파일)를 다운로드한다. 
   이때 명령어는 get container/filename.ext destination.ext 로 입력한다. 그렇지 않으면 오류를 발생시킨다.
   다운로드 방법은 InputStream으로 읽어들여 FileOutputStream으로 출력한다.
- head
 : 컨테이너 개체수, 총사이즈 정보를 출력한다.
- head <container name>
 : 선택한 컨테이너의 객체(파일)수와 총사이즈를 출력한다.
- head <object name>
 : 선택한 객체의 Metadata가 있을경우에만 해당 정보를 보여준다.
   선택한 파일의 총 사이즈, 파일 타입, 또 다른 메타데이터가 있다면 해당 정보를 출력해 준다.
- put <container_name>
 : 새로운 컨테이너(디렉토리)를 생성한다.
   우선, 저장경로가 있는지 체크한 후 해당정장경로로 컨테이너(디렉토리)를 생성한다.
- put <local file>
 : 객체(파일)을 업로드한다.
   1) 업로드할 파일이 있는지 체크한다. 2) 파일명, 확장자, 파일타입를 추출한다.
   3) 컨테이너(디렉토리)가 있는지 체크한다. 4) 해당 컨테이너(디렉토리)로 파일을 저장한다.
- delete <object name>
 : 선택한 객체(파일)를 삭제한다.
- delete <container name>
 : 선택한 컨테이너(디렉토리)를 삭제한다.
신고
Posted by 나리 짱!!! naleejang