らくがきちょう

なんとなく

Cisco ACI App Center アプリケーションのアプリケーション構造

Cisco ACI App Center アプリケーションは規定に従ったディレクトリ/ファイル構造になっている必要があります。 今回はこのディレクトリ構造を見てみます。

アプリケーション作成の流れ

App Center 向けのアプリケーションは概ね以下のような流れで作成します。

  1. 規定に従ったディレクトリ/ファイル構造を作成する
  2. メタデータを用意する
  3. コードを書く
  4. パッケージングする

パッケージングには Getting Started with ACI App Center にある App Packager Utility を使ってパッケージングします。

アプリケーションは .zip 形式で圧縮されている

App Packager Utility 1.0 でパッケージを圧縮するコードは cisco_aci_app_packager-1.0/packager/aci_app_packager.py の 168 〜 190 行目あたりにある make_aci に書かれています。 この部分を見ると圧縮には OS の zip コマンドを呼び出しているのが分かります。

# sed -n '168,190p' cisco_aci_app_packager-1.0/packager/aci_app_packager.py
    def make_aci(self):
        try:
            os.chdir(self.tmpfileLoc)
            cmd = 'zip -r {0} *'.format(self.signedAppFile)
            rc = commands.getstatusoutput(cmd)
            if rc[0]:
                raise Exception()
        except Exception as e:
            if len(str(e)):
                logger.error(str(e))
            print_and_log_error('Error: Failed to compress and create app')
            os.chdir(orig_wk_dir)
            return 1
        '''
        MBFACTOR = float(1<<20)
        size_App=os.path.getsize(self.tmpfileLoc + '/' + self.appDirName)/MBFACTOR
        g = float("{0:.2f}".format(size_App))
        if(size_App>1000):
            print ("Size of app :"+app_name+" should be less than 1000 MB,current file size is : "+str(g)+" MB")
            logger.error('Size of <app.aci>  should be less than 1000 MB')
            return 1
        '''
        return 0

アプリケーションの種類(Stateless / Stateful)

アプリケーションには以下の 2 種類が存在します。

番号 種類 特徴
1 Stateless 状態を持たない(持てない)。 Web フロントエンドだけで構成される
2 Stateful 状態を持てる。 バックエンドとして Docker コンテナをアプリケーションに含める必要がある

Stateful アプリケーションの場合は Docker コンテナイメージをアプリケーション内に含める必要がある為、アプリケーションのサイズが大きくなる傾向が強いです。

アプリケーションのディレクトリ構成

上述の通り、Stateless アプリケーションとは異なり「Stateful アプリケーションは Docker コンテナイメージを含む必要がある」という違いがありますので当然、両アプリケーションの構造は微妙に異なります。 以下は公式サイトからディレクトリ/ファイル構造の図を引用します。

Stateless アプリケーションの構造(Developing a Stateless Application から引用)

f:id:sig9:20170319125143p:plain:w480

Stateful アプリケーションの構造(Developing a Stateful Application から引用)

f:id:sig9:20170319130340p:plain:w480

サンプルアプリケーションのディレクトリ構造を見てみる

stateful アプリケーションのサンプルは Getting Started with ACI App CenterA Reference Stateful App として用意されています。 このサンプルアプリケーションをダウンロードして展開してみると(当たり前ですが)ディレクトリ構造のガイドラインに準拠した構成になっていることが分かります。

# unzip Cisco-HelloAciStateful-1.0.aci
Archive:  Cisco-HelloAciStateful-1.0.aci
   creating: Cisco_HelloAciStateful/
  inflating: Cisco_HelloAciStateful/app.json
   creating: Cisco_HelloAciStateful/Image/
  inflating: Cisco_HelloAciStateful/Image/aci_appcenter_docker_image.tgz
   creating: Cisco_HelloAciStateful/Legal/
  inflating: Cisco_HelloAciStateful/Legal/Cisco_App_Center_Customer_Agreement.docx
  inflating: Cisco_HelloAciStateful/Legal/Cisco_App_Center_Export_Compliance_Questionnaire.docx
   creating: Cisco_HelloAciStateful/Media/
  inflating: Cisco_HelloAciStateful/Media/.DS_Store
   creating: Cisco_HelloAciStateful/Media/IntroVideo/
  inflating: Cisco_HelloAciStateful/Media/IntroVideo/AppCenter Video Placeholder.mp4
   creating: Cisco_HelloAciStateful/Media/License/
  inflating: Cisco_HelloAciStateful/Media/License/Cisco_App_Center_License.txt
   creating: Cisco_HelloAciStateful/Media/Readme/
  inflating: Cisco_HelloAciStateful/Media/Readme/readme.txt
   creating: Cisco_HelloAciStateful/Media/Snapshots/
  inflating: Cisco_HelloAciStateful/Media/Snapshots/screenshot.png
   creating: Cisco_HelloAciStateful/Service/
  inflating: Cisco_HelloAciStateful/Service/plugin_server.py
  inflating: Cisco_HelloAciStateful/Service/start.sh
   creating: Cisco_HelloAciStateful/UIAssets/
  inflating: Cisco_HelloAciStateful/UIAssets/app-start.html
  inflating: Cisco_HelloAciStateful/UIAssets/app.html
  inflating: Cisco_HelloAciStateful/UIAssets/app.js
   creating: Cisco_HelloAciStateful/UIAssets/d3/
  inflating: Cisco_HelloAciStateful/UIAssets/d3/d3.js
  inflating: Cisco_HelloAciStateful/UIAssets/d3/d3.min.js
  inflating: Cisco_HelloAciStateful/UIAssets/d3/LICENSE
  inflating: Cisco_HelloAciStateful/UIAssets/HelloAci.png
   creating: Cisco_HelloAciStateful/UIAssets/jquery/
  inflating: Cisco_HelloAciStateful/UIAssets/jquery/jquery.2.1.4.js
  inflating: Cisco_HelloAciStateful/UIAssets/jquery/jquery.leanModal.min.js
  inflating: Cisco_HelloAciStateful/UIAssets/misc.js
  inflating: Cisco_HelloAciStateful/UIAssets/style.css

treeディレクトリ/ファイル構造を表示した結果は以下の通りです。

# tree Cisco_HelloAciStateful/
Cisco_HelloAciStateful/
├── app.json
├── Image
│   └── aci_appcenter_docker_image.tgz
├── Legal
│   ├── Cisco_App_Center_Customer_Agreement.docx
│   └── Cisco_App_Center_Export_Compliance_Questionnaire.docx
├── Media
│   ├── IntroVideo
│   │   └── AppCenter\ Video\ Placeholder.mp4
│   ├── License
│   │   └── Cisco_App_Center_License.txt
│   ├── Readme
│   │   └── readme.txt
│   └── Snapshots
│       └── screenshot.png
├── Service
│   ├── plugin_server.py
│   └── start.sh
└── UIAssets
    ├── app.html
    ├── app.js
    ├── app-start.html
    ├── d3
    │   ├── d3.js
    │   ├── d3.min.js
    │   └── LICENSE
    ├── HelloAci.png
    ├── jquery
    │   ├── jquery.2.1.4.js
    │   └── jquery.leanModal.min.js
    ├── misc.js
    └── style.css

11 directories, 21 files

参考