APIC GUI の Troubleshooting

     

     

    はじめに

     

    APIC の GUI 表示に問題がある場合、Browser が受け取っている情報そのものがおかしい場合と、受け取った情報の出力に問題がある場合のどちらかになります。

    Browser が受け取っている情報がおかしいかどうかを確認するための Tool としては、API Inspector があり、この Tool については既に API Inspector の活用 で紹介しています。 そのため、ここでは受け取った情報をどのように出力しているかを調べる方法について紹介します。

     

     

    1. 問題

     

    Screen Shot 2019-02-22 at 9.58.06.png

    今回は、例として上記 Leaf Switch の Management port がなぜ orange になっているのかを調べていきます。

    mgmt0 の Properties を見ると、Admin State, Oper State どちらも up になっているし、色も green になっているにも関わらず、左側の mgmt0 icon では orange 出力になっているので、その理由が気になります。 そこで、どのような条件で色付けをしているのか Browser に実装されている Tool を用いて調べていくことにします。

     

     

    2. Google Chrome Developer Tools

    Screen Shot 2019-02-22 at 10.00.44.png

     

    右上の設定 icon から Developer Tool を起動できます。 今回は Google Chrome を使用していますが、他 Browser でも同様に起動できると思います。

     

    Screen Shot 2019-02-22 at 10.02.02.png

     

    port を orange 表示させる時にどのような処理が行われているのかを確認するため、Developer Tool の Console を表示させた状態で、Management Interfaces を click して見ると、上のように大量の console message が出力されます。 その中に layout/Pannel.js という気になる出力があるので、この file を開いて書かれている内容を調べてみます。

     

    Screen Shot 2019-02-22 at 10.05.23.png

     

    javascript の内容を確認すると port の色を取得していると思われる関数 getPortStatusColor を呼び出しているので、その関数が書かれているところを検索し file を開きます。

     

    Screen Shot 2019-02-22 at 10.05.56.png

     

    Screen Shot 2019-02-22 at 10.06.42.png

     

    Screen Shot 2019-02-22 at 10.08.31.png

     

    その file の最初の comment 欄に、各状態と色の対応が書かれています。

    下記に書かれている通り、switchingSt というのが disabled になっていると orange になることがわかります。

     

    /**
    * Users: Catalin Dumitru & Fabio Ingrao
    * Copyright 2012-2018 Insieme Networks, Inc.
    */
    
    
    /*
    *
    interface.adminSt  ethpm.operSt           interface.switchingSt  color           port.adminSt
    ----------------   ------------------     --------------------   ----------      -------------
    up            -                       -                     white            portDisabled
    up            up                      enabled               green            portEnabled
    up            up                      disabled              orange           portDisabledSwitching
    up            link-up          -                   yellow           portDisabledLink
    up            down                -                     red              portEnabledError
    *
    */
    
    
    
    
    Ext.define('insieme.stromboli.topology.PortInfo', {
    alternateClassName: 'insieme.PortInfo',
    singleton: true,
        colorToStatus: {
            white: 'portDisabled',
            green: 'portEnabled',
            orange: 'portDisabledSwitching',
            yellow: 'portDisabledLink',
            red: 'portEnabledError'
        },
    // colorConsts keeps track between the status of an interface and the status mark's color
    colorConsts: {
    portDisabled: "white",
    portEnabled: "green",
    portDisabledSwitching: "orange",
    portDisabledLink: "yellow",
    portEnabledError: "red"
    },
    // statusConts keeps track of all the status options
    statusConsts: {
    enabled: "enabled",
    disabled: "disabled",
    up: "up",
    down: "down",
    linkUp: "link-up",
    trunking: "trunking"
    },
    // paramConst keeps track of all the params needed in order to apply a state;
    paramConst: {
    operSt: "operSt",
    adminSt: "adminSt",
    switchingSt: "switchingSt",
    
    
    },
    
    
        determineColor: function(interfaceMo) {
            // this method is used in order to determine the color of the status mark for Interfaces and Interface related objects
            // rules used are described in the table present at the beginning of this file
            var statusConsts = this.statusConsts;
            var colorConsts = this.colorConsts;
            var adminSt = interfaceMo.adminSt;
            var operSt, className, switchingSt;
    
    
            if (adminSt === statusConsts.down || adminSt === statusConsts.disabled) {
                return colorConsts.portDisabled;
            }
    
    
            operSt = interfaceMo.operSt;
            className = interfaceMo.className;
            switchingSt = interfaceMo.switchingSt;
    
    
            if (operSt && adminSt) {
                if (operSt === statusConsts.up && adminSt === statusConsts.up) {
                    if (switchingSt === statusConsts.enabled || className === 'insieme.stromboli.model.def.l1FcPhysIf') {
                        return colorConsts.portEnabled;
                    } else if (switchingSt === statusConsts.disabled) {
                        return colorConsts.portDisabledSwitching;
                    }
                    return colorConsts.portDisabledLink;
                }
                else if (operSt === statusConsts.down && adminSt === statusConsts.up) {
                    return colorConsts.portEnabledError;
                }
            }
    
    
            if (operSt === statusConsts.linkUp){
                return colorConsts.portDisabledLink;
            }
    
    
            // for FEX ports where FEX-to-leaf is disabled
            if (className === "insieme.stromboli.model.def.l1PhysIf" && !operSt) {
                return colorConsts.portDisabled;
            }
        },
    
    
    buildMoFromL1PhysAndEthpmPhys: function(interfaceObj, ethpmObj) {
    // this method builds an object containing the required params in order to determine a status color
    var interfaceMo = {
    className: interfaceObj.$className,
    adminSt: "",
    operSt: "",
    switchingSt: ""
    };
    
    
    interfaceMo.adminSt = interfaceObj.get(this.paramConst.adminSt) ? interfaceObj.get(this.paramConst.adminSt) : null;
    
    if (ethpmObj) {
    interfaceMo.operSt = ethpmObj.get(this.paramConst.operSt) ? ethpmObj.get(this.paramConst.operSt) : null;
    // for some objects I was unable to find the swState, so I will set it if undefined or null as true until further updates
    // for those objects we will check the operSt and adminSt
    interfaceMo.switchingSt = ethpmObj.get(this.paramConst.switchingSt) ? ethpmObj.get(this.paramConst.switchingSt) : interfaceObj.get(this.paramConst.switchingSt);
    } else {
    interfaceMo.operSt = interfaceObj.get(this.paramConst.operSt);
    interfaceMo.switchingSt = interfaceObj.get(this.paramConst.switchingSt);
    }
    if (!interfaceMo.switchingSt || interfaceMo.switchingSt === true) {
    interfaceMo.switchingSt = this.statusConsts.enabled;
    }
    if (interfaceMo.operSt === this.statusConsts.trunking) {
    interfaceMo.operSt = this.statusConsts.up;
    }
    return interfaceMo;
    
    
    },
    
    
        getPortStatusColor: function(interfaceObj, ethpmObj) {
    // this method returns the status color for the provided interface
    var state;
    state = this.determineColor(this.buildMoFromL1PhysAndEthpmPhys(interfaceObj, ethpmObj));
            return state;
    }
    });
    
    

     

     

    3. 結論

     

    上記 code から switchingSt が disabled になっている場合、orange になることがわかりました。

    APIC GUI では、switchingSt という項目は表示されていないようですが、実際に mgmt0 が持っている mo 情報を Object Store Browser を用いて確認してみます。

     

    Screen Shot 2019-02-22 at 10.09.01.png

     

    Screen Shot 2019-02-22 at 10.09.21.png

    Object Store Browser (Visore) で確認すると、switchingSt が disabled になっていることが確認できます。 つまり、mgmt0 が orange になっているのは code 上は期待通りに動作していると言えます。

    ちなみに、switchingSt は、port に対して policy が適用されると up になりますが、management port の場合、常に disabled になります。 そのため、mgmt0 は正常時は orange で、link down 等なんらかの問題がある場合は red になります。

     

    3.2 で動作を確認した時は上記のように switchingSt が出力されていないため、確かに、"あれ?" と思ってしまいますが、4.1 では下記のように Switching State という項目が GUI に追加されているので、そもそもこう言った疑問を抱かないかもしれません。

     

    Screen Shot 2019-02-22 at 10.14.50.png

     

    APIC の表示部分の Troubleshooting は今回の例のように、ある程度細かい条件まで自分で調査することが可能です。

    ACI の Troubleshooting は一般的な linux command や汎用の Tool を使って切り分け可能なことが多く、cisco.com 内に document はなく、検索 engine 等ですぐに見つかることも多々あります。 そのため、Troubleshooting を行う前に、自分が確認したいことは、ACI 固有の知識を必要とするのか、それ以外の知識を必要とするのかを切り分けた上で最適な方法で検索することをお勧めします。