Index: /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/avx/models/network/interface/__init__.py
===================================================================
--- /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/avx/models/network/interface/__init__.py	(revision 8841)
+++ /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/avx/models/network/interface/__init__.py	(working copy)
@@ -179,6 +179,9 @@
     shutdown_tgt = FieldGroup(verbose_name=_('Interface Shutdown'), level=ADVANCED, fields={
         'shutdown': AssoField2(verbose_name=_('Interface Shutdown'), tgt='network.interface.Shutdown.port_name', mul='1', pos='left', optional=True)
     })
+    description_tgt = FieldGroup(verbose_name=_('Description'), level=ADVANCED, fields={
+        'description': AssoField2(verbose_name=_('Description'), tgt='network.interface.Description.port_name', mul='1', pos='left', optional=True)
+    })
 
     class Meta:
         verbose_name = _('Traffic Interface')
@@ -202,15 +205,17 @@
             self.cli.set_enable()
             parser = RegexParser('(?P<interface_name>port[0-9]+?)\((?P<physical_name>[^\)]+)\):\s+flags=[^>]+>\s+mtu\s+(?P<mtu>[0-9]+)((?!ether).)*?' +
                                     '\s+ether\s+"?(?P<mac>[\w|0-9|:]+)((?!RX packets).)*?' + 
-                                    '\s+RX packets\s(?P<rx_packets>[0-9]+)\s+bytes\s(?P<rx_bytes>[0-9]+)((?!TX packets).)*?' + 
-                                    '\s+TX packets\s(?P<tx_packets>[0-9]+)\s+bytes\s(?P<tx_bytes>[0-9]+)[^\)]+\)\n([^\n]+\n){2}\s+(?P<model>[^\n]+)\n', MATCHALL, reflags=re.S)
+                                    '\s+RX packets\s(?P<rx_packets>[0-9]+)\s+bytes\s(?P<rx_bytes>[0-9]+).*?' + 
+                                    '(TX packets\s(?P<tx_packets>[0-9]+)\s+bytes\s(?P<tx_bytes>[0-9]+)).*?' + 
+                                    '(?P<model>[0-9]+ lost carrier, [0-9]+ WDT reset)', MATCHALL, reflags=re.S)
             
             parser2 = RegexParser('(?P<interface_name>port[0-9]+?)\((?P<physical_name>[^\)]+)\):\s+This port has been passed through to a VA instance\.', MATCHALL, reflags=re.S)
 
             parser3 = RegexParser('(?P<interface_name>port[0-9]+?):\s+flags=[^>]+>\s+mtu\s+(?P<mtu>[0-9]+)((?!ether).)*?' +
                                     '\s+ether\s+"?(?P<mac>[\w|0-9|:]+)((?!RX packets).)*?' + 
-                                    '\s+RX packets\s(?P<rx_packets>[0-9]+)\s+bytes\s(?P<rx_bytes>[0-9]+)((?!TX packets).)*?' + 
-                                    '\s+TX packets\s(?P<tx_packets>[0-9]+)\s+bytes\s(?P<tx_bytes>[0-9]+)[^\)]+\)\n([^\n]+\n){2}\s+(?P<model>[^\n]+)\n', MATCHALL, reflags=re.S)
+                                    '\s+RX packets\s(?P<rx_packets>[0-9]+)\s+bytes\s(?P<rx_bytes>[0-9]+).*?' + 
+                                    '(TX packets\s(?P<tx_packets>[0-9]+)\s+bytes\s(?P<tx_bytes>[0-9]+)).*?' + 
+                                    '(?P<model>[0-9]+ lost carrier, [0-9]+ WDT reset)', MATCHALL, reflags=re.S)
 
             result = self.cli.cmd('show interface', [parser, parser2, parser3])
             result2 = self.cli.cmd('show system resource',
@@ -701,4 +706,65 @@
                                 BlankParser(nonblank_exception=CLICmdError, supplement=True))
             mark_expire_all(TrafficInterface)
             mark_expire_all(PortVF)
+            return
+
+class Description(ANModel):
+    port_name = AssoField2(verbose_name=_('Port Name'), tgt='network.interface.TrafficInterface.description', mul='*', pos='right', primary_key=True)
+    description = CharField(verbose_name=_('Description'), length='1..255', editable=True, optional=True)
+
+    class Meta:
+        verbose_name = 'Description'
+        show_im_export_button = False
+
+    class Manager(CLIManager):
+        def _get(self, pk_dict):
+            return self._filter(pk_dict).get(pk_dict)
+
+        def _filter(self, pk_list):
+            self.cli.set_enable()
+            res = []
+            if pk_list:
+                port_name = pk_list['port_name'][0]['interface_name']
+                cli_output = self.cli.cmd('show interface %s' % port_name)
+                match_flag = False
+                if cli_output and 'description' in cli_output:
+                    result = cli_parse(cli_output, 
+                                       RegexParser('(?P<port_name>port[0-9]+)\((?P<physical_name>[^\)]+)\):\s*(?:.*\n\s*)*description:\s*(?P<description>[^\n\r]+)', MATCHALL, reflags=re.S))
+                    for each in result:
+                        if port_name != "mgmt" and each["port_name"] == port_name  and each['description']:
+                            match_flag = True
+                            res.append({"port_name": port_name, "description": each['description']})
+                            break
+                if not match_flag:
+                    res.append({"port_name": port_name, "description": ""})
+            else:
+                cli_output = self.cli.cmd('show interface')
+                if cli_output and 'description' in cli_output:
+                    result = cli_parse(cli_output, 
+                                        [
+                                            RegexParser('(?P<port_name>port[0-9]+)\((?P<physical_name>[^\)]+)\):\s*(?:.*\n\s*)*description:\s*(?P<description>[^\n\r]+)', MATCHALL, reflags=re.S),
+                                            RegexParser('(?P<port_index>port[0-9]+):', MATCHALL, reflags=re.S),
+                                        ])
+                    for each in result[1]:
+                        match_flag = False
+                        for item in result[0]:
+                            if item["port_name"] == each["port_index"] and item['description']:
+                                match_flag = True
+                                res.append({"port_name": item["port_name"], "description": item['description']})
+                                break
+                        if not match_flag:
+                            res.append({"port_name": each["port_index"], "description": ""})
+            return QuerySet(self._model, res)
+
+        def _update(self, instance):
+            self.cli.set_config()
+            port_name = instance.port_name[0]["interface_name"]
+            if instance.description and instance.description.strip():
+                result = self.cli.cmd('interface description %s "%s"' % (port_name, instance.description),
+                                BlankParser(nonblank_exception=CLICmdError, supplement=True))
+            else:
+                result = self.cli.cmd('no interface description %s' % port_name,
+                                BlankParser(nonblank_exception=CLICmdError, supplement=True))
+            mark_expire_all(TrafficInterface)
+            mark_expire_all(PortVF)
             return
Index: /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/network.service.js
===================================================================
--- /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/network.service.js	(revision 8841)
+++ /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/network.service.js	(working copy)
@@ -88,7 +88,9 @@
                 clear_default_route: clear_default_route,
                 update_vlan_vf_of_port: update_vlan_vf_of_port,
                 get_shutdown: get_shutdown,
-                set_shutdown: set_shutdown
+                set_shutdown: set_shutdown,
+                get_description: get_description,
+                set_description: set_description
             };
             function bind_port_vf_to_va(data) {
                 return apiService.post('/api/avx/network/interface/PortVF/_add', data);
@@ -441,5 +443,12 @@
                 var post_data = {"post_data": JSON.stringify({"shutdown_enable": enable})};
                 return apiService.post('/api/avx/network/interface/Shutdown/_update/port_name/%5B%7B%22interface_name%22%3A%20%22'+ port_name +'%22%2C%20%22_asso_idx%22%3A%200%7D%5D', post_data);
             }
+            function get_description(port_name) {
+                return apiService.get('/api/avx/network/interface/Description/_get_asso_list_data?initial_filter=%7B"port_name"%3A%5B%7B"interface_name"%3A"'+port_name+'"%2C"_asso_idx"%3A0%7D%5D%7D');
+            }
+            function set_description(port_name, description) {
+                var post_data = {"post_data": JSON.stringify({"description": description})};
+                return apiService.post('/api/avx/network/interface/Description/_update/port_name/%5B%7B%22interface_name%22%3A%20%22'+ port_name +'%22%2C%20%22_asso_idx%22%3A%200%7D%5D', post_data);
+            }
         }
 ]);
\ No newline at end of file
Index: /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/submenu/interface/sys_interface/sys_interface.controller.js
===================================================================
--- /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/submenu/interface/sys_interface/sys_interface.controller.js	(revision 8841)
+++ /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/submenu/interface/sys_interface/sys_interface.controller.js	(working copy)
@@ -94,6 +94,35 @@
                     });
             };
 
+            resourceViewModel.get_description = function(port_name) {
+                netResourceService
+                    .get_description(port_name)
+                    .then(function(res) {
+                        if (res && res.status === 200) {
+                            resourceViewModel.description = res.data[0]["description"];
+                            resourceViewModel.description_origin = resourceViewModel.description;
+                        }
+                    });
+            };
+
+            resourceViewModel.set_description = function(port_name, description) {
+                if (description == resourceViewModel.description_origin) {
+                    return;
+                }
+                netResourceService
+                    .set_description(port_name, description)
+                    .then(function(res) {
+                        if (res && res.status === 200) {
+                            if (!res.data[0]) {
+                                alert(res.data[1]);
+                                resourceViewModel.get_description(port_name);
+                            } else {
+                                $state.go("index.network.interface.sys_interface", {}, {reload:true})
+                            }
+                        }
+                    });
+            };
+
             resourceViewModel.get_system_index = function() {
                 return resourceViewModel.system_index;
             };
@@ -1639,4 +1668,4 @@
                 });
             };
         }
-    ]);
+    ]);
\ No newline at end of file
Index: /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/submenu/interface/sys_interface/sys_interface.html
===================================================================
--- /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/submenu/interface/sys_interface/sys_interface.html	(revision 8841)
+++ /branches/rel_avx_2_7_2/src/webui/webui/htdocs/new/src/client/app/modules/network/submenu/interface/sys_interface/sys_interface.html	(working copy)
@@ -42,7 +42,7 @@
                             </tr>
                         </thead>
                         <tbody ng-show="displayedCollection.length">
-                            <tr ng-repeat="row in displayedCollection" ng-click="interface.get_vf_occupation(row.port_name, row.vf_available);interface.set_port_index(row.port_name);interface.port_detail_index = 1;interface.system_detail_index = 0;interface.system_index = 0;interface.get_work_mode(row.port_name);interface.get_shutdown(row.port_name)" style="cursor: pointer;">
+                            <tr ng-repeat="row in displayedCollection" ng-click="interface.get_vf_occupation(row.port_name, row.vf_available);interface.set_port_index(row.port_name);interface.port_detail_index = 1;interface.system_detail_index = 0;interface.system_index = 0;interface.get_work_mode(row.port_name);interface.get_shutdown(row.port_name);interface.get_description(row.port_name)" style="cursor: pointer;">
                                 <td>{{row.domain}}</td>
                                 <td>{{row.port_name}}</td>
                                 <td>{{row.physical_name}}</td>
@@ -251,7 +251,7 @@
                    <a href ng-click="interface.select_detail(1)">{{'Interface Information'|T}}</a>
                 </li>
                 <li ng-class="{ active:interface.isSelect_detail(6)}">
-                   <a href ng-click="interface.select_detail(6);interface.get_work_mode(interface.current_port_data.port_name);interface.get_shutdown(interface.current_port_data.port_name)">{{'Interface Setting'|T}}</a>
+                   <a href ng-click="interface.select_detail(6);interface.get_work_mode(interface.current_port_data.port_name);interface.get_shutdown(interface.current_port_data.port_name);interface.get_description(interface.current_port_data.port_name)">{{'Interface Setting'|T}}</a>
                 </li>
                 <!-- <li ng-class="{ active:interface.isSelect_detail(7)}" ng-if="interface.work_mode_origin">
                    <a href ng-click="interface.select_detail(7)">{{'Bind VA Instance'|T}}</a>
@@ -335,9 +335,15 @@
                             </div>
                         </div>
                     </div>
+                    <div class="form-group">
+                        <label class="col-md-3 control-label">{{'Description'|T}}</label>
+                        <div class="col-md-9">
+                            <input ng-model="interface.description" type="text" class="form-control" name="interfaceDescription" resettable>
+                        </div>
+                    </div>
                     <div ng-show="work_mode.$dirty">
-                        <button type="submit" class="btn btn-primary" ng-click="interface.set_work_mode(interface.current_port_data.port_name, interface.work_mode);interface.set_shutdown(interface.current_port_data.port_name, interface.shutdown)">{{'Apply Changes'|T}}</button>
-                        <button type="reset" class="btn btn-default btn-cancel" ng-click="interface.get_work_mode(interface.current_port_data.port_name);interface.get_shutdown(interface.current_port_data.port_name)" unsaved-warning-clear>{{'Cancel'|T}}</button>
+                        <button type="submit" class="btn btn-primary" ng-click="interface.set_work_mode(interface.current_port_data.port_name, interface.work_mode);interface.set_shutdown(interface.current_port_data.port_name, interface.shutdown);interface.set_description(interface.current_port_data.port_name, interface.description)">{{'Apply Changes'|T}}</button>
+                        <button type="reset" class="btn btn-default btn-cancel" ng-click="interface.get_work_mode(interface.current_port_data.port_name);interface.get_shutdown(interface.current_port_data.port_name);interface.get_description(interface.current_port_data.port_name)" unsaved-warning-clear>{{'Cancel'|T}}</button>
                     </div>
                 </form>
             </div>
