Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZAuthManager.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZAuthManager.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZAuthManager.py	(working copy)
@@ -23,9 +23,7 @@
         output_controller.end_to_file()
     elif  args.mode=='show':
         output_controller = OutputController()
-        output_controller.start_to_file()
         az_auth_controller.show_az()
-        output_controller.end_to_file()
     else:
         print(f"Error: mode arugment must be login, logout, and show. mode:[{args.mode}]")
     
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZFailoverManager.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZFailoverManager.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZFailoverManager.py	(working copy)
@@ -19,18 +19,23 @@
         self.to_nic_name = ip_config_setting['to_nic_name']
         # self.to_ip_config_name = ip_config_setting['to_ip_config_name']
     def failover_happen(self):
-        '''two things to do: 1. transfer ip config.'''
+        '''transfer ip config.'''
         ProxyAZLogger.info("start to transfer all IPs")
         nicC = NICController(self.subscription_id, self.resource_group_name)
-        nicC.transfer_all_ip_config(from_nic_name=self.from_nic_name, to_nic_name=self.to_nic_name)
-        ProxyAZLogger.info("finish transfering all IPs")
-
+        try:
+            nicC.transfer_all_ip_config(from_nic_name=self.from_nic_name, to_nic_name=self.to_nic_name)
+            ProxyAZLogger.info("finish transfering all IPs")
+        except Exception as e:
+            ProxyAZLogger.error("Fail to transfer all ip config: "+str(e))
+        
     def failover_recover(self):
         ProxyAZLogger.info("start to transfer all IPs")
         nicC = NICController(self.subscription_id, self.resource_group_name)
-        nicC.transfer_all_ip_config(from_nic_name=self.to_nic_name, to_nic_name= self.from_nic_name)
-        ProxyAZLogger.info("finish to transfer all IPs")
-
+        try:
+            nicC.transfer_all_ip_config(from_nic_name=self.to_nic_name, to_nic_name= self.from_nic_name)
+            ProxyAZLogger.info("finish to transfer all IPs")
+        except Exception as e:
+            ProxyAZLogger.error("Fail to transfer all ip config: "+str(e))
 if __name__=="__main__":
     parser = argparse.ArgumentParser(description='Process optional name argument.')
     parser.add_argument('-mode', type=str, help='Enter 1 or 2: mode 1 is for failover happen; mode 2 is failover recover')
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZFailoverPoller.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZFailoverPoller.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/AZFailoverPoller.py	(working copy)
@@ -62,13 +62,13 @@
 
 
     def kill_poller(self, process_name):
-        '''Using psutil to kill the process by its name.'''
+        '''This method will kill all the process with the same name of process_name.'''
         for proc in psutil.process_iter(['pid', 'cmdline']):
-            if process_name in proc.info['cmdline']:
-                proc.kill()
-                ProxyAZLogger.info(f'kill {process_name}')
-                return
-        ProxyAZLogger.info(f"Didn't stop poller. Cannnot found module name:{process_name}. Please check current module name.", )
+            if proc.info['cmdline']:
+                for peice_of_cmd in proc.info['cmdline']:
+                    if process_name in peice_of_cmd and (not proc.info['pid']==os.getpid()) :
+                        proc.kill()
+                        ProxyAZLogger.info("kill process_name")
     
     def stop(self):
         '''kill poller that is another running process by its filename, a.k.a. this file name.'''
@@ -85,15 +85,18 @@
                 time.sleep(interval)
         except KeyboardInterrupt:
             ProxyAZLogger.error("\nProcess interrupted. Exiting...")
-    def is_poller_running(self)->bool:
+    def is_poller_running(self, this_mode)->bool:
         '''This method is used to determine if the poller is running or not.
         return True if it is running
         return False if it isn't running
         '''
         module_name = os.path.basename(__file__)
         for proc in psutil.process_iter(['pid', 'cmdline']):
-            if module_name in proc.info['cmdline']:
-                return True
+            # print(module_name, proc.info, os.getpid())
+            if proc.info['cmdline']:
+                for peice_of_cmd in proc.info['cmdline']:
+                    if module_name in peice_of_cmd and (not proc.info['pid']==os.getpid()) :
+                        return True
         return False
 if __name__=='__main__':
     parser = argparse.ArgumentParser(description='''This API is used to start polling, stop polling, and check the status of poller for IPs transfering''')
@@ -107,20 +110,21 @@
     ip_config_setting_json = ip_config_manager.get_ip_config()
 
     if args.mode=='1':
-        if az_poller.is_poller_running():
+        if not az_poller.is_poller_running(args.mode):
             ProxyAZLogger.info("start polling mode")    
             az_poller.start(ip_config_setting_json)
         else:
             ProxyAZLogger.info("try to start polling mode, but poller has been running")
             
     elif  args.mode=='2':
-        if not az_poller.is_poller_running():
+        if not az_poller.is_poller_running(args.mode):
             ProxyAZLogger.info("stop polling mode")
             az_poller.stop()
         else:
             ProxyAZLogger.info("try to stop polling mode, but the poller isn't running")    
     elif args.mode=="3":
-        status = az_poller.is_poller_running()
+        status = az_poller.is_poller_running(args.mode)
+        print(status)
         if status:
             ProxyAZLogger.info(f"check {os.path.basename(__file__)} status: running")
         else:
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/ConfigManager.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/ConfigManager.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/ConfigManager.py	(working copy)
@@ -120,6 +120,8 @@
     elif  args.mode=='clear':
         ProxyAZLogger.info("config manager clear mode")
         ip_config_manager.clear_ip_config(args.index)
-
+    elif args.mode=='getipconfig':
+        ProxyAZLogger.info("config manager getconfig mode")
+        print(ip_config_manager.get_ip_config())
     else:
         ProxyAZLogger.error(f"Error: mode must arugment must be set, show, and clear. mode:[{args.mode}]")
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/LoggerManager.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/LoggerManager.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/LoggerManager.py	(working copy)
@@ -26,15 +26,22 @@
     @classmethod
     def set_logger_level(cls, level:str)->None:
         ProxyAZLogger.set_level(level)
-        
+    @classmethod
+    def set_logger_level(cls, level:str)->None:
+        ProxyAZLogger.set_level(level)
+    @classmethod
+    def get_log_file_path(cls)->str:
+        log_file_path = ProxyAZLogger.get_log_file_path()
+        ProxyAZLogger.info("get log file path: "+log_file_path)
+        return log_file_path
 if __name__=='__main__':
     description = '''This API is used to 
     1. manipulate the mode(on or off) of the functionality.
     2. dump the log message.
     3. check current logger status
-    3. set the log severity and show log severity'''
+    4. set the log severity and show log severity'''
     parser = argparse.ArgumentParser(description=description)
-    parser.add_argument('-mode', type=str, choices=["on", "off", "show", "status"], help='Enter [on], [off], and [show]')
+    parser.add_argument('-mode', type=str, choices=["on", "off", "show", "status", "getlogpath"], help='Enter [on], [off], [getlogpath], or [show]')
     parser.add_argument('-level', type=str, choices=["debug", "info", "warning", "error", "status"], help='choose severity amond [debug], [info], [warning], or [error]')
     args = parser.parse_args()
 
@@ -54,6 +61,8 @@
         print(log)
     elif args.mode=="status":
         print(LoggerManager.check_Logger_state())
+    elif args.mode=="getlogpath":
+        print(LoggerManager.get_log_file_path())
 
 
     
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/RouteConfigManager.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/RouteConfigManager.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/RouteConfigManager.py	(working copy)
@@ -54,7 +54,6 @@
     def clear_UDR_config(self, idx=0):
         if os.path.exists(self.ip_config_file_path):
             ProxyAZLogger.info(f"clear UDR config with idx: {idx}")
-            
             if idx == 0:
                 os.remove(self.ip_config_file_path)
                 print('clear all ip configuration')
@@ -85,11 +84,12 @@
         }
 
         ip_config_setting_json = self.get_UDR_config()
+        ProxyAZLogger.info(ip_config_setting_json)
+        
         for idx in range(1, 200+1):
             if not f"{idx}" in ip_config_setting_json:
                 ip_config_setting_json[f"{idx}"] = data
                 break
-
         # Write the dictionary of setting to a JSON file
         self.save_UDR_config(ip_config_setting_json)
         ProxyAZLogger.info(f"save UDR config: {ip_config_setting_json}")
@@ -141,8 +141,11 @@
         ProxyAZLogger.info("show route config")
         route_config_manager.show_UDR_config(args.index)
     elif  args.mode=='clear':
-        ProxyAZLogger.info("clear route config")
+        ProxyAZLogger.info("clear route config index:"+str(args.index))
         route_config_manager.clear_UDR_config(args.index)
-
+    elif  args.mode=='getrouteconfig':
+        ProxyAZLogger.info("get route config")
+        print(route_config_manager.get_UDR_config())
+        
     else:
         print(f"Error: mode must arugment must be set, show, and clear. mode:[{args.mode}]")
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/UDRPoller.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/UDRPoller.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/UDRPoller.py	(working copy)
@@ -9,8 +9,14 @@
 from RouteConfigManager import RouteConfigManager
 from logger.ProxyAZLogger import ProxyAZLogger
 class UDRPoller():
-    def __init__(self, rout_table_config_setting_json) -> None:
-        self.rout_table_config_setting_json = rout_table_config_setting_json
+    def __init__(self, setting_file_location:str) -> None:
+        self.setting_file_location = setting_file_location
+        self.reload_route_table_config_setting_json()
+        
+    def reload_route_table_config_setting_json(self):
+        route_config_manager = RouteConfigManager(self.setting_file_location)
+        self.route_table_config_setting_json = route_config_manager.get_UDR_config()
+        
     def start(self):
         polling_period = 2 #seconds
 
@@ -18,8 +24,9 @@
         is_target_vm_down_list = []
         route_table_update_count_list = []
         route_table_controller_list = []
-        for idx in self.rout_table_config_setting_json:
-            data = self.rout_table_config_setting_json[idx]
+        
+        for idx in self.route_table_config_setting_json:
+            data = self.route_table_config_setting_json[idx]
             
             vm_controller = VMController(
                 data['subscription_id'],
@@ -37,29 +44,37 @@
             route_table_controller_list.append(route_table_controller)
 
         while True:
-            time.sleep(polling_period)
+            # self.reload_route_table_config_setting_json()
             
+            time.sleep(polling_period)
             i = 0
-            for idx in self.rout_table_config_setting_json:
-                data = self.rout_table_config_setting_json[idx]
+            for idx in self.route_table_config_setting_json:
+                data = self.route_table_config_setting_json[idx]
 
                 ProxyAZLogger.info("UDR pooling")
                 if not vm_controller_list[i].is_VM_alive_by_name(data["monitored_vm_name"]):
                     # target vm is down
                     ProxyAZLogger.info("detect target vm is down")
-                    route_table_controller_list[i].change_all_UDR_routes_by_ip(
-                        ori_next_hop_ip=data["target_ip_when_running"],
-                        modify_next_hop_ip=data["target_ip_when_deallocated"],
-                    )
+                    print("detect target vm is down")
+                    try:
+                        route_table_controller_list[i].change_all_UDR_routes_by_ip(
+                            ori_next_hop_ip=data["target_ip_when_running"],
+                            modify_next_hop_ip=data["target_ip_when_deallocated"],
+                        )
+                    except Exception as e:
+                        ProxyAZLogger.error("Fail change all UDR route: "+str(e))
                     # set vm status
                     is_target_vm_down_list[i]=True
                 else:
                     # target vm is up
                     ProxyAZLogger.info("detect target vm is up")
-                    route_table_controller_list[i].change_all_UDR_routes_by_ip(
-                        ori_next_hop_ip=data["target_ip_when_deallocated"],
-                        modify_next_hop_ip=data["target_ip_when_running"],
-                    )
+                    try:
+                        route_table_controller_list[i].change_all_UDR_routes_by_ip(
+                            ori_next_hop_ip=data["target_ip_when_deallocated"],
+                            modify_next_hop_ip=data["target_ip_when_running"],
+                        )
+                    except Exception as e:
+                        ProxyAZLogger.error("Fail change all UDR route: "+str(e))
                     # set vm status
                     is_target_vm_down_list[i]=False
                 
@@ -85,24 +100,27 @@
         module_name = os.path.basename(__file__)
         self.kill_poller(module_name)
     def kill_poller(self, process_name):
-            for proc in psutil.process_iter(['pid', 'cmdline']):
-                if process_name in proc.info['cmdline']:
-                    proc.kill()
-                    print('kill ', process_name)
-                    return
-            print(f"Didn't stop poller. Cannnot found module name:{process_name}. Please check current module name.", )
+        '''This method will kill all the process with the same name of process_name.'''
+        for proc in psutil.process_iter(['pid', 'cmdline']):
+            if proc.info['cmdline']:
+                for peice_of_cmd in proc.info['cmdline']:
+                    if process_name in peice_of_cmd and (not proc.info['pid']==os.getpid()) :
+                        proc.kill()
+                        ProxyAZLogger.info("kill "+process_name)
 
-    def is_poller_running(self)->bool:
+    def is_poller_running(self, this_mode)->bool:
         '''This method is used to determine if the poller is running or not.
         return True if it is running
         return False if it isn't running
         '''
         module_name = os.path.basename(__file__)
         for proc in psutil.process_iter(['pid', 'cmdline']):
-            if module_name in proc.info['cmdline']:
-                return True
+            # print(proc.info, os.getpid())
+            if proc.info['cmdline']:
+                for peice_of_cmd in proc.info['cmdline']:
+                    if module_name in peice_of_cmd and (not proc.info['pid']==os.getpid()) :
+                        return True
         return False
-        
 if __name__=='__main__':
     parser = argparse.ArgumentParser(description='''This API is used to start polling, stop polling, and check the status of poller for UDR transfering''')
     parser.add_argument('-mode', type=str, choices=['1', '2', '3'], help='Enter 1 or 2: mode 1 is for starting polling; mode 2 is for stopping polling; mode 3 is for checking poller status')
@@ -111,26 +129,23 @@
     config_dir = '/ca/conf/'
     route_table_config_setting_file_name = 'route_table_config_setting.json'
     setting_file_location = os.path.join(config_dir, route_table_config_setting_file_name)
-    route_config_manager = RouteConfigManager(setting_file_location)
-    rout_table_config_setting_json = route_config_manager.get_UDR_config()
-
-    udr_poller = UDRPoller(rout_table_config_setting_json)
+    udr_poller = UDRPoller(setting_file_location)
     if args.mode=='1':
-        if not udr_poller.is_poller_running():
+        if not udr_poller.is_poller_running(args.mode):
             ProxyAZLogger.info("starting polling mode")
             udr_poller.start()
         else:
-            ProxyAZLogger.info("try to start polling mode, but poller has been running")
+            ProxyAZLogger.info("try to start UDR polling mode, but poller has been running")
 
     elif args.mode=='2':
-        if udr_poller.is_poller_running():
+        if udr_poller.is_poller_running(args.mode):
             ProxyAZLogger.info("stopping polling mode")
             udr_poller.stop()
         else:
-            ProxyAZLogger.info("try to stop polling mode, but the poller isn't running")       
+            ProxyAZLogger.info("try to stop UDR polling mode, but the poller isn't running")       
             
     elif args.mode=="3":
-        status = udr_poller.is_poller_running()
+        status = udr_poller.is_poller_running(args.mode)
         print(status)
         if status:
             ProxyAZLogger.info(f"check {os.path.basename(__file__)} status: running")
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/az_auth/AZAuthController.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/az_auth/AZAuthController.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/az_auth/AZAuthController.py	(working copy)
@@ -30,7 +30,6 @@
         # print("Execute command ", " ".join(command))
         login_msg_file = self.get_login_message_file(file_name=login_msg_file_name)
         result = subprocess.Popen(command, stdout=login_msg_file, stderr=login_msg_file)
-
         while result.poll() is None:
             print('waiting user login by broswer')
             time.sleep(1)
@@ -85,14 +84,11 @@
     def show_az(self):
         AZLogger.info("show az log in information")
         command = ["az", "account", "show"]
-        # print("Execute command ", " ".join(command))
         result = subprocess.run(command, capture_output=True, text=True)
         if result.returncode==0:
-            print("result.stdout", result.stdout)
+            print(result.stdout)
         else:
             print("Please log in az first.")
-            # print(result.stdout)
-            # print(result.stderr)
         
 
 if __name__=="__main__":
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/az_route_table/RouteTableController.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/az_route_table/RouteTableController.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/az_route_table/RouteTableController.py	(working copy)
@@ -1,7 +1,7 @@
 from azure.identity import DefaultAzureCredential
 from azure.mgmt.network import NetworkManagementClient
 from azure.mgmt.network.models import (Route, RouteNextHopType)
-
+from logger.ProxyAZLogger import ProxyAZLogger
 class RouteTableController():
     def __init__(self, 
                 subscription_id= "2960d47a-5c8a-44eb-a95c-c71227757824",
@@ -96,7 +96,7 @@
                     self.route_table_name,
                     route_rule_name
                 ).wait()
-                print(f"Route '{route_rule_name}' deleted successfully from route table '{self.route_table_name}'")
+                ProxyAZLogger.info(f"Route '{route_rule_name}' deleted successfully from route table '{self.route_table_name}'")
             else:
                 print(f"Route '{route_rule_name}' not found in route table '{self.route_table_name}'")
         except Exception as e:
@@ -131,8 +131,8 @@
         subscription_id= "2960d47a-5c8a-44eb-a95c-c71227757824",
         resource_group_name= "AZURECENTOS",
     )
-    target_ip_when_running = "10.0.3.101"
-    target_ip_when_deallocated = "10.0.3.100"
+    target_ip_when_running = "10.0.100.30"
+    target_ip_when_deallocated = "10.0.100.31"
     rc.change_all_UDR_routes_by_ip(
         ori_next_hop_ip=target_ip_when_running,
         modify_next_hop_ip=target_ip_when_deallocated
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/logger/ProxyAZLogger.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/logger/ProxyAZLogger.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/tools/azure/logger/ProxyAZLogger.py	(working copy)
@@ -105,7 +105,10 @@
         '''
         config = cls.get_config()
         return config["level_of_severity"]
-    
+    @classmethod
+    def get_log_file_path(cls)->str:
+        config = cls.get_config()
+        return config["log_path"]
     @classmethod
     def debug(cls, message:str)->None:
         cls._refresh_config()
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/router.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/router.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/router.py	(working copy)
@@ -699,4 +699,27 @@
         "device_unhealthy_count" : device_unhealthy_count,
     }))
 
+def get_cloud_page(request):
+    if not request.GET['type'] or not request.GET['page']:
+        raise Http404('Page not found')
+    env = HiveEnvironment(loader=ChoiceLoader([
+                                      PackageLoader('apv', 'templates')]))
+    if request.GET['type'] == "azure":
+        if request.GET['page'] == "basic":
+            template = env.get_template("/ha/cloud/azure/basic.html")
+            response = HttpResponse(template.render())
+            return response
+        elif request.GET['page'] == "nic":
+            template = env.get_template("/ha/cloud/azure/nic.html")
+            response = HttpResponse(template.render())
+            return response
+        elif request.GET['page'] == "udr":
+            template = env.get_template("/ha/cloud/azure/udr.html")
+            response = HttpResponse(template.render())
+            return response
+        elif request.GET['page'] == "log":
+            template = env.get_template("/ha/cloud/azure/log.html")
+            response = HttpResponse(template.render())
+            return response
+    raise Http404('Page not found')
 
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/basic.html
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/basic.html	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/basic.html	(working copy)
@@ -0,0 +1,160 @@
+<form class="form-horizontal main-form">
+<div class="row-fluid">
+    <div class="span12 with-min-width field-group-box">
+        <fieldset>
+            <div class="form-group">
+                <label class="col-md-3 control-label">{% trans %}Status{% endtrans %}:</label>
+                <div class="col-md-9 status_field">
+                    <div class="align_center_for_info">...</div>
+                </div>
+            </div>
+        </fieldset>
+        <fieldset class="not_logged_check">
+            <div class="form-group">
+                <label class="col-md-3 control-label">{% trans %}Login Url{% endtrans %}:</label>
+                <div class="col-md-9 url_field">
+                    <a href="#" class="align_center_for_info" target="_blank">...</a>
+                    <span class="field-icon-set"><i class="fa fa-question-circle"></i></span>
+                </div>
+            </div>
+        </fieldset>
+        <fieldset class="not_logged_check">
+            <div class="form-group">
+                <label class="col-md-3 control-label">{% trans %}Code{% endtrans %}:</label>
+                <div class="col-md-9 code_field">
+                    <div class="align_center_for_info" target="_blank">...</div>
+                    <span class="field-icon-set"><i class="fa fa-question-circle"></i></span>
+                </div>
+            </div>
+        </fieldset>
+        <fieldset class="error_field">
+            <div class="form-group">
+                <div class="col-md-3"></div>
+                <div class="error-info">{% trans %}Internal error, please refresh the page.{% endtrans %}</div>
+            </div>
+        </fieldset>
+        <fieldset>
+            <div class="form-group">
+                <label class="col-md-3 control-label"></label>
+                <div class="col-md-9">
+                    <button type="button" class="btn btn-primary btn-log-out">{% trans %}Log Out{% endtrans %}</button>
+                </div>
+            </div>
+        </fieldset>
+    </div>
+</div>
+</form>
+<style type="text/css">
+.align_center_for_info {
+    line-height: 28px;
+}
+.btn-log-out {
+    display: none;
+}
+.code_field div {
+    display: inline-block;
+}
+.code_field span {
+    display: none;
+}
+.error_field {
+    display: none;
+}
+</style>
+
+{% block box_script %}
+
+<script type="text/javascript">
+
+$(function () {
+
+    getStatus();
+    function getStatus () {
+        $('.status_field div').html('...');
+        $('.btn-log-out').css('display', 'none');
+        $.ajax({
+            url: "/api/v1/cloud/az/login/status/",
+            type: 'GET',
+            dataType: 'json',
+            success: function (res) {
+                var status = false;
+                if (typeof (res["status"]) != "undefined") {
+                    status = res["status"];
+                }
+                if (!status) {
+                    getInformation();
+                    $('.status_field div').html("{% trans %}Not logged in{% endtrans %}");
+                    return;
+                }
+                $('.not_logged_check').css('display', 'none');
+                $('.status_field div').html("{% trans %}Logged in{% endtrans %}");
+                $('.btn-log-out').css('display', 'block');
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                getInformation();
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+    function getInformation () {
+        $.ajax({
+            url: "/api/v1/cloud/az/login/",
+            type: 'GET',
+            dataType: 'json',
+            success: function (res) {
+                var url = "", code = "";
+                if (typeof (res["url"]) != "undefined") {
+                    url = res["url"];
+                }
+                if (typeof (res["code"]) != "undefined") {
+                    code = res["code"];
+                }
+                $('.url_field a').html(url).prop('href', url);
+                $('.code_field div').html(code);
+                $('.code_field span').css('display', 'inline-block');
+                var content = [
+                    '{% trans %}Please login using the above information in 1 minute.{% endtrans %}<br />',
+                    '{% trans %}After 1 minute the login credential will be clear.{% endtrans %}<br />',
+                    '{% trans %}WARNING: To sign in, use a web browser to open the page {% endtrans %}',
+                    url,
+                    '{% trans %} and enter the code {% endtrans %}',
+                    code,
+                    '{% trans %} to authenticate.{% endtrans %}'
+                ].join("");
+                $('.field-icon-set').popover({
+                    trigger: "hover",
+                    content: content,
+                    html: true
+                });
+                $('.not_logged_check').css('display', 'block');
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+                $('.error_field').css('display', 'block');
+            }
+        });
+    }
+
+    $('.btn-log-out').click(function() {
+        var that = this;
+        $(that).prop('disabled', true);
+        $.ajax({
+            url: "/api/v1/cloud/az/logout/",
+            type: 'POST',
+            dataType: 'json',
+            success: function (res) {
+                $(that).prop('disabled', false);
+                getStatus();
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                $(that).prop('disabled', false);
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    });
+
+});
+
+</script>
+
+{% endblock box_script %}
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/index.html
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/index.html	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/index.html	(working copy)
@@ -0,0 +1,120 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+{% block horizontal_nav %}
+<div class="horizontal-nav">
+    <div class="crumbs">
+        <a href="/apv/ha/cloud/azure/_index"><i class="fa fa-home"></i></a>
+    </div>
+<ul class="nav nav-tabs">
+    <li class="active">
+        <a href="/apv/ha/cloud/azure/_index">Azure</a>
+    </li>
+</ul>
+</div>
+<div></div>
+{% endblock horizontal_nav %}
+
+<div class="head-nav-box clearfix-before">
+{% block model_nav %}
+<nav class="head-nav" role="navigation">
+    <a class="model-name" href="#" style="width:90%;"><i class="fa fa-folder-open"></i>&nbsp;Azure</a>
+</nav>
+{% endblock model_nav %}
+</div>
+
+{% block sub_nav %}
+<ul class="config-nav nav nav-pills" style="display:none;">
+    <li class="active">
+        <a class="config-nav-a" val="/apv/get_cloud_page?type=azure&page=basic" href="javascript:;">{% trans %}Basic Settings{% endtrans %} <i class="fa fa-wrench"></i></a>
+        <ul class="sub-config-nav group-index">
+            <li><a val="/apv/get_cloud_page?type=azure&page=basic" href="javascript:;">General</a></li>
+        </ul>
+    </li>
+    <li>
+        <a class="config-nav-a" val="/apv/get_cloud_page?type=azure&page=nic" href="javascript:;">{% trans %}NIC{% endtrans %} <i class="fa fa-wrench"></i></a>
+        <ul class="sub-config-nav group-nic">
+            <li><a val="/apv/get_cloud_page?type=azure&page=nic" href="javascript:;">General</a></li>
+        </ul>
+    </li>
+    <li>
+        <a class="config-nav-a" val="/apv/get_cloud_page?type=azure&page=udr" href="javascript:;">{% trans %}UDR{% endtrans %} <i class="fa fa-wrench"></i></a>
+        <ul class="sub-config-nav group-udr">
+            <li><a val="/apv/get_cloud_page?type=azure&page=udr" href="javascript:;">General</a></li>
+        </ul>
+    </li>
+    <li>
+        <a class="config-nav-a" val="/apv/get_cloud_page?type=azure&page=log" href="javascript:;">{% trans %}Log{% endtrans %} <i class="fa fa-wrench"></i></a>
+        <ul class="sub-config-nav group-log">
+            <li><a val="/apv/get_cloud_page?type=azure&page=log" href="javascript:;">General</a></li>
+        </ul>
+    </li>
+</ul>
+<ul class="sub-config-nav-real"></ul>
+<script type="text/javascript">
+require(['jquery'], function(){
+    if ($('.config-nav li').length > 1) {
+        $('.config-nav').show();
+    }
+});
+</script>
+{% endblock %}
+
+<div id="frame_model_main" class="frame" style="display: block;">
+</div>
+<style type="text/css">
+#frame_model_main {
+    position: relative;
+}
+.align_center_for_info {
+    line-height: 28px;
+}
+</style>
+
+{% endblock %}
+
+{% block page_javascript %}
+<script type="text/javascript">
+require(['jquery'], function(){
+    $(".config-nav-a").on("click", function(e) {
+        e.preventDefault();
+    });
+});
+require(['hive', 'widget-form'], function(){
+    var initiator = new Object();
+    $HIVE.enable_event(initiator);
+    $(".config-nav a.config-nav-a").click(function(){
+        $(".config-nav li").removeClass("active");
+        $(this).parents("li").addClass("active");
+        var sub_nav = $($(this).parents('li').find('ul')[0])
+        if (sub_nav && sub_nav.children().length > 1) {
+           var real_sub_nav = sub_nav.clone(true).removeClass('sub-config-nav').addClass('sub-config-nav-real');
+            $(".sub-config-nav-real").replaceWith(real_sub_nav);
+            $(".sub-config-nav-real").show();
+            $("#frame_instance_main").css("padding-top", "50px");
+            real_sub_nav.find('a').click(function(){
+                $(".sub-config-nav-real li").removeClass("active");
+                $(this).parents("li").addClass("active");
+                var url = $(this).attr('val')
+                $HIVE.ajax_load_box(url, initiator, $("#frame_model_main"));
+                return false;
+            });
+            $(".sub-config-nav-real a:first").trigger("click");
+        } else {
+            $("#frame_instance_main").css("padding-top", "0px");
+            $(".sub-config-nav-real").empty();
+            $(".sub-config-nav-real").hide();
+            var url = $(this).attr('val')
+            $HIVE.ajax_load_box(url, initiator, $("#frame_model_main"));
+        }
+       
+        return false;
+    });
+    $(".config-nav a:first").trigger("click");
+});
+</script>
+{% endblock %}
+
+{% block box_script %}
+{% endblock %}
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/log.html
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/log.html	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/log.html	(working copy)
@@ -0,0 +1,218 @@
+
+<form class="form-horizontal main-form">
+    <div class="row-fluid">
+        <div class="span12 with-min-width field-group-box">
+            <fieldset>
+                <div class="group_actions"></div>
+                <div class="form-group switch switch_enable">
+                    <label class="col-md-3 control-label">{% trans %}Enable{% endtrans %}:</label>
+                    <div class="col-md-9">
+                        <input class="switch-small" type="checkbox" name="switch_btn"
+                        data-on-label="{% trans %}On{% endtrans %}"
+                        data-off-label="{% trans %}Off{% endtrans %}" />
+                        <span class="field-icon-set"></span>
+                    </div>
+                </div>
+            </fieldset>
+            <fieldset>
+                <div class="form-group">
+                    <label class="col-md-3 control-label">{% trans %}Level{% endtrans %}</label>
+                    <div class="col-md-9">
+                        <select class="selectpicker select-level">
+                            <option value="debug">0: {% trans %}Debug{% endtrans %}</option>
+                            <option value="info">1: {% trans %}Info{% endtrans %}</option>
+                            <option value="warning">2: {% trans %}Warning{% endtrans %}</option>
+                            <option value="error">3: {% trans %}Error{% endtrans %}</option>
+                        </select>
+                        <span class="field-icon-set"><i class="fa fa-question-circle" style="display:none;"></i></span>
+                    </div>
+                </div>
+            </fieldset>
+            <fieldset>
+                <div class="form-group">
+                    <label class="col-md-3 control-label"></label>
+                    <div class="col-md-9">
+                        <button type="button" class="btn btn-primary download-btn">{% trans %}Download{% endtrans %}</button>
+                    </div>
+                </div>
+            </fieldset>
+            <fieldset>
+                <pre class="log_content"></pre>
+            </fieldset>
+        </div>
+    </div><!-- row-fluid -->
+    <div class="btn-static">
+        <div class="btn-switch">
+            <button type="button" class="btn btn-action btn-submit">{% trans %}Save Changes{% endtrans %}</button>
+            <button type="button" class="btn btn-default btn-cancel-action">{% trans %}Cancel{% endtrans %}</button>
+        </div>
+    </div>
+</form>
+<style type="text/css">
+.main-form pre {
+    background: #1b2d43;
+}
+.btn-static {
+    display: none;
+}
+</style>
+
+{% block box_script %}
+
+<script type="text/javascript">
+
+$(function() {
+    var enableSwitch = $("input[name='switch_btn']").bootstrapSwitch();
+    var is_init = 0;
+    getEnableStatus();
+    function getEnableStatus() {
+        $.ajax({
+            url: '/api/v1/cloud/az/log/status/',
+            type: 'GET',
+            dataType: 'json',
+            success: function (res) {
+                if (typeof(res["is_on"]) == "undefined") {
+                    return;
+                }
+                enableSwitch.bootstrapSwitch('setState', res["is_on"]);
+                is_init++;
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+    enableSwitch.on('switch-change', function(e, data) {
+        if (is_init < 2) {
+            return;
+        }
+        $('#frame_model_main .btn-static').fadeIn("slow");
+        if ($(".btn-static").is(":visible")) {
+            var buttonH = $(".btn-static").offset().top;  
+            $(function(){ 
+                $(window).scroll(function(){ 
+                    var scrollH = $(this).scrollTop();  
+                    if (scrollH >= buttonH) {
+                        $(".btn-switch").addClass("btn-fixed");
+                    }else{  
+                        $(".btn-switch").removeClass("btn-fixed");
+                    } 
+                });
+            });
+        }
+    });
+    $('.select-level').selectpicker();
+    getLogLevel();
+    function getLogLevel() {
+        $.ajax({
+            url: '/api/v1/cloud/az/log/severity/',
+            type: 'GET',
+            dataType: 'json',
+            success: function (res) {
+                if (typeof(res["severity"]) == "undefined") {
+                    return;
+                }
+                $('.select-level').selectpicker("val", res["severity"]);
+                is_init++;
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+    $(".select-level").change(function() {
+        if (is_init < 2) {
+            return;
+        }
+        $('#frame_model_main .btn-static').fadeIn("slow");
+        if ($(".btn-static").is(":visible")) {
+            var buttonH = $(".btn-static").offset().top;  
+            $(function(){ 
+                $(window).scroll(function(){ 
+                    var scrollH = $(this).scrollTop();  
+                    if (scrollH >= buttonH) {
+                        $(".btn-switch").addClass("btn-fixed");
+                    }else{  
+                        $(".btn-switch").removeClass("btn-fixed");
+                    } 
+                });
+            });
+        }
+    });
+    $('.btn-cancel-action').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        refreshPage();
+    });
+    $('.btn-submit').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        var enable = enableSwitch.bootstrapSwitch('state'); // true / false
+        var ajaxes = [];
+        ajaxes.push($.ajax({
+            url: '/api/v1/cloud/az/log/status/',
+            type: 'PUT',
+            dataType: 'json',
+            data: JSON.stringify({
+                status: (enable ? 'on' : 'off')
+            }),
+            success: function (res) {
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        }));
+        ajaxes.push($.ajax({
+            url: '/api/v1/cloud/az/log/severity/',
+            type: 'PUT',
+            dataType: 'json',
+            data: JSON.stringify({
+                severity: $(".select-level").selectpicker('val')
+            }),
+            success: function (res) {
+                refreshPage();
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        }));
+        $.when.apply($, ajaxes)
+        .done(function(){
+            refreshPage();
+        });
+    });
+
+    $('.download-btn').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        window.open("/api/v1/cloud/az/logfile/");
+    });
+
+    getInit();
+    function getInit() {
+        $.ajax({
+            url: '/api/v1/cloud/az/log/',
+            type: 'GET',
+            dataType: 'json',
+            success: function(res) {
+                if (typeof(res["message"]) == "undefined") {
+                    return;
+                }
+                $('.log_content').html(res["message"]);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+
+    function refreshPage() {
+        $('.config-nav li.active a').trigger('click');
+    }
+});
+
+</script>
+{% endblock box_script %}
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/nic.html
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/nic.html	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/nic.html	(working copy)
@@ -0,0 +1,457 @@
+<form class="form-horizontal main-form">
+<div class="row-fluid">
+    <div class="span12 with-min-width field-group-box">
+        <fieldset>
+            <div class="group_actions"></div>
+            <div class="form-group switch switch_enable">
+                <label class="col-md-3 control-label">{% trans %}Enable{% endtrans %}:</label>
+                <div class="col-md-3">
+                    <input class="switch-small" type="checkbox" name="switch_btn"
+                    data-on-label="{% trans %}Enable{% endtrans %}"
+                    data-off-label="{% trans %}Disabled{% endtrans %}" />
+                    <span class="field-icon-set"></span>
+                </div>
+                <label class="col-md-3 control-label">{% trans %}Manual Trigger{% endtrans %}:</label>
+                <div class="col-md-3 col-manual-trigger">
+                    <button type="button" class="btn btn-primary failover-btn">{% trans %}Failover{% endtrans %}</button>
+                    <button type="button" class="btn btn-primary recover-btn">{% trans %}Recover{% endtrans %}</button>
+                </div>
+            </div>
+        </fieldset>
+        <fieldset>
+            <div class="form-group add-btn-style">
+                <div class="col-md-3">
+                    <button type="button" class="btn btn-action add-btn"><i class="fa fa-plus-circle"></i>{% trans %}ADD{% endtrans %}</button>
+                </div>
+                <div class="col-md-9" id="app"></div>
+            </div>
+        </fieldset>
+    </div>
+</div>
+<!-- row-fluid -->
+<div class="btn-static">
+    <div class="btn-switch">
+        <button type="button" class="btn btn-action btn-submit">{% trans %}Save Changes{% endtrans %}</button>
+        <button type="button" class="btn btn-default btn-cancel-action">{% trans %}Cancel{% endtrans %}</button>
+    </div>
+</div>
+<div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="box modal-content">
+            <div class="box-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true"></span></button>
+                    <h2>{{ gettext('New %s')%"NIC" }}</h2>
+                </button>
+            </div>
+            <div class="box-body">
+                <form class="form-horizontal main-form">
+                    <div class="padded">
+                        <div class="row-fluid">
+                            <div class="span12 with-min-width field-group-box modal-fields">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-actions col-md-offset-3">
+                        <button type="button" class="btn btn-action btn-save">{% trans %}Submit{% endtrans %}</button>
+                        <button type="button" data-dismiss="modal" class="btn btn-default btn-cancel">{% trans %}Cancel{% endtrans %}</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+</form>
+<style type="text/css">
+.add-btn-style {
+    text-align: right;
+}
+.add-btn-style .add-btn {
+    background-color: transparent;
+    border: 0;
+}
+.modal-fields {
+    padding-top: 20px;
+}
+.form-actions {
+    padding-bottom: 20px;
+}
+#app {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+}
+#app .block {
+    min-width: 200px;
+    box-sizing: border-box;
+    margin-right: 20px;
+}
+#app .box.modal-content {
+    border-radius: 6px;
+}
+#app .block .modal-dialog {
+    width: 100%;
+    margin: 0;
+}
+#app .box-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-right: 10px;
+    padding-left: 10px;
+}
+#app .box-header button.close:active {
+    opacity: 0.2;
+}
+#app .box-body ul {
+    padding: 0;
+    list-style: none;
+}
+#app .box-body ul li {
+    padding: 5px;
+    text-align: left;
+}
+.btn-static {
+    display: none;
+}
+</style>
+</div>
+
+{% block box_script %}
+
+<script type="text/javascript">
+
+$(function(){
+    var enableSwitch = $("input[name='switch_btn']").bootstrapSwitch();
+    var is_init = 0;
+    getEnableStatus();
+    function getEnableStatus() {
+        $.ajax({
+            url: '/api/v1/cloud/az/nicpoller/status/',
+            type: 'GET',
+            dataType: 'json',
+            success: function (res) {
+                if (typeof(res["is_running"]) == "undefined") {
+                    return;
+                }
+                enableSwitch.bootstrapSwitch('setState', res["is_running"]);
+                is_init++;
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+    enableSwitch.on('switch-change', function(e, data) {
+        if (is_init < 1) {
+            return;
+        }
+        $('#frame_model_main .btn-static').fadeIn("slow");
+        if ($(".btn-static").is(":visible")) {
+            var buttonH = $(".btn-static").offset().top;  
+            $(function(){ 
+                $(window).scroll(function(){ 
+                    var scrollH = $(this).scrollTop();  
+                    if (scrollH >= buttonH) {
+                        $(".btn-switch").addClass("btn-fixed");
+                    }else{  
+                        $(".btn-switch").removeClass("btn-fixed");
+                    } 
+                });
+            });
+        }
+    });
+    $('.btn-cancel-action').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        refreshPage();
+    });
+    $('.btn-submit').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        var enable = enableSwitch.bootstrapSwitch('state'); // true / false
+        $.ajax({
+            url: '/api/v1/cloud/az/nicpoller/',
+            type: 'PUT',
+            dataType: 'json',
+            data: JSON.stringify({
+                status: (enable ? 'on' : 'off')
+            }),
+            success: function (res) {
+                refreshPage();
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    });
+    var modal_fields = [{
+        field: '{% trans %}Sub ID{% endtrans %}',
+        id: 'sub_id',
+        value: ''
+    }, {
+        field: '{% trans %}Resource Grop Name{% endtrans %}',
+        id: 'res_grp_name',
+        value: ''
+    }, {
+        field: '{% trans %}Source NIC Name{% endtrans %}',
+        id: 'src_nic_name',
+        value: ''
+    }, {
+        field: '{% trans %}Destination NIC Name{% endtrans %}',
+        id: 'dest_nic_name',
+        value: ''
+    }];
+    // for displaying fields in each block
+    var show_fields = ['src_nic_name', 'dest_nic_name'];
+    var is_show_field_title = true;
+
+    $('.add-btn').click(function() {
+        var content = setContent(modal_fields);
+        $('.modal-fields').html(content);
+        $('#addModal').modal();
+    });
+    $('.failover-btn').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        var that = this;
+        $(that).css("disabled", true);
+        $.ajax({
+            url: '/api/v1/cloud/az/nictrigger/',
+            type: 'PUT',
+            dataType: 'json',
+            data: JSON.stringify({
+                status: 'failover'
+            }),
+            success: function (res) {
+                if (typeof(res["message"]) == "undefined") {
+                    return;
+                }
+                alert(res["message"]);
+                $(that).css("disabled", false);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+                $(that).css("disabled", false);
+            }
+        });
+    });
+    $('.recover-btn').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        var that = this;
+        $(that).css("disabled", true);
+        $.ajax({
+            url: '/api/v1/cloud/az/nictrigger/',
+            type: 'PUT',
+            dataType: 'json',
+            data: JSON.stringify({
+                status: 'recover'
+            }),
+            success: function (res) {
+                if (typeof(res["message"]) == "undefined") {
+                    return;
+                }
+                alert(res["message"]);
+                $(that).css("disabled", false);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+                $(that).css("disabled", false);
+            }
+        });
+    });
+    var config = [];
+    $('.btn-save').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        var each = {};
+        $('.field').each(function() {
+            if ($(this).val() == "") {
+                return;
+            }
+            each[$(this).data('id')] = $(this).val();
+        });
+        if (Object.keys(each).length < 1) {
+            return;
+        }
+        addNIC(each.sub_id, each.res_grp_name, each.src_nic_name, each.dest_nic_name);
+    });
+
+    getInit();
+    function getInit() {
+        $.ajax({
+            url: '/api/v1/cloud/az/nicconfig/',
+            type: 'GET',
+            dataType: 'json',
+            success: function(res) {
+                for (var index in res) {
+                    config.push({
+                        primary_key: index,
+                        sub_id: res[index].subscription_id,
+                        res_grp_name: res[index].res_grp_name,
+                        src_nic_name: res[index].from_nic_name,
+                        dest_nic_name: res[index].to_nic_name
+                    })
+                }
+                updateBlockList(config, show_fields, is_show_field_title);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+
+    /**
+     * Return html string for content of pop up window(Add)
+     * @param array setting: array for each setting
+     * @return string
+     */
+    function setContent(setting) {
+        var html = [];
+        for (var ind = 0; ind < setting.length; ++ind) {
+            var each = setting[ind];
+            html.push([
+                '<fieldset>',
+                    '<div class="group_actions"></div>',
+                        '<div class="form-group">',
+                        '<label class="col-md-3 control-label">',
+                            setting[ind].field,
+                        ':</label>',
+                        '<div class="col-md-9">',
+                            '<input type="text" class="field" data-id="' + setting[ind].id,
+                            '" value="' + setting[ind].value + '" />',
+                        '</div>',
+                    '</div>',
+                '</fieldset>'
+            ].join(""));
+        }
+        return html.join("");
+    }
+
+    /**
+     * Update layout for each blocks
+     * @param array setting: array of block information
+     * @param array fields: array of displaying fields, empty is all
+     * @param bool value_only: display value or [field: value] for each list
+     * @return void
+     */
+    function updateBlockList(setting, fields = [], value_only = true) {
+        var html = [];
+        var nameMapping = getNameMapping(); // ex: sub_id: SubId
+        for (var ind = 0; ind < setting.length; ++ind) {
+            var list = [];
+            for (var field in setting[ind]) {
+                if (fields.length !== 0 && fields.indexOf(field) === -1) {
+                    // Not display
+                    continue;
+                }
+                if (field == "primary_key") {
+                    // Not display
+                    continue;
+                }
+                var content = setting[ind][field];
+                if (!value_only) {
+                    var display_name = "";
+                    if (nameMapping.hasOwnProperty(field)) {
+                        display_name = nameMapping[field];
+                    }
+                    content = display_name + ": " + content;
+                }
+                list.push([
+                    '<li data-id="' + field + '">' + content + '</li>'
+                ].join(""));
+            }
+            html.push([
+                '<div class="block">',
+                    '<div class="modal-dialog">',
+                        '<div class="box modal-content">',
+                            '<div class="box-header">',
+                                '<span>' + setting[ind]['primary_key'] + '</span>',
+                                '<button type="button" class="close" aria-label="Close"',
+                                    'data-id="' + setting[ind]['primary_key'] + '">',
+                                    '<span aria-hidden="true">&times;</span></button>',
+                            '</div>',
+                            '<div class="box-body">',
+                                '<ul>',
+                                    list.join(""),
+                                '</ul>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join(""));
+        }
+        $('#app').html(html.join(""));
+        $('#app .block .box-header button').click(function() {
+            var index = parseInt($(this).data("id"));
+            delNIC(index);
+        });
+    }
+
+    function addNIC(sub_id, res_grp_name, src_nic_name, dest_nic_name) {
+        $.ajax({
+            url: '/api/v1/cloud/az/nicconfig/',
+            type: 'POST',
+            dataType: 'json',
+            data: JSON.stringify({
+                sub_id: sub_id,
+                res_grp_name: res_grp_name,
+                src_nic_name: src_nic_name,
+                dest_nic_name: dest_nic_name
+            }),
+            success: function(res) {
+                $('#addModal').modal('hide');
+                setTimeout(function() {
+                    refreshPage();
+                }, 400);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                $('#addModal').modal('hide');
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+
+    function delNIC(index) {
+        $.ajax({
+            url: '/api/v1/cloud/az/nicconfig/',
+            type: 'DELETE',
+            dataType: 'json',
+            data: JSON.stringify({
+                index: index
+            }),
+            success: function(res) {
+                refreshPage();
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+
+    /**
+     * Get Display name mapping by index
+     * @return object
+     */
+    function getNameMapping() {
+        var mapping = {};
+        for (var ind = 0; ind < modal_fields.length; ++ind) {
+            mapping[modal_fields[ind].id] = modal_fields[ind].field;
+        }
+        return mapping;
+    }
+
+    function refreshPage() {
+        $('.config-nav li.active a').trigger('click');
+    }
+
+});
+
+</script>
+{% endblock box_script %}
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/udr.html
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/udr.html	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/templates/ha/cloud/azure/udr.html	(working copy)
@@ -0,0 +1,406 @@
+<form class="form-horizontal main-form">
+<div class="row-fluid">
+    <div class="span12 with-min-width field-group-box">
+        <fieldset>
+            <div class="group_actions"></div>
+            <div class="form-group switch switch_enable">
+                <label class="col-md-3 control-label">{% trans %}Enable{% endtrans %}:</label>
+                <div class="col-md-9">
+                    <input class="switch-small" type="checkbox" name="switch_btn"
+                    data-on-label="{% trans %}Enable{% endtrans %}"
+                    data-off-label="{% trans %}Disabled{% endtrans %}" />
+                    <span class="field-icon-set"></span>
+                </div>
+            </div>
+        </fieldset>
+        <fieldset>
+            <div class="form-group add-btn-style">
+                <div class="col-md-3">
+                    <button type="button" class="btn btn-action add-btn"><i class="fa fa-plus-circle"></i>{% trans %}ADD{% endtrans %}</button>
+                </div>
+                <div class="col-md-9" id="app"></div>
+            </div>
+        </fieldset>
+    </div>
+</div>
+<!-- row-fluid -->
+<div class="btn-static">
+    <div class="btn-switch">
+        <button type="button" class="btn btn-action btn-submit">{% trans %}Save Changes{% endtrans %}</button>
+        <button type="button" class="btn btn-default btn-cancel-action">{% trans %}Cancel{% endtrans %}</button>
+    </div>
+</div>
+<div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="box modal-content">
+            <div class="box-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true"></span></button>
+                    <h2>{{ gettext('New %s')%"UDR" }}</h2>
+                </button>
+            </div>
+            <div class="box-body">
+                <form class="form-horizontal main-form">
+                    <div class="padded">
+                        <div class="row-fluid">
+                            <div class="span12 with-min-width field-group-box modal-fields">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-actions col-md-offset-3">
+                        <button type="button" class="btn btn-action btn-save">{% trans %}Submit{% endtrans %}</button>
+                        <button type="button" data-dismiss="modal" class="btn btn-default btn-cancel">{% trans %}Cancel{% endtrans %}</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+</form>
+<style type="text/css">
+.add-btn-style {
+    text-align: right;
+}
+.add-btn-style .add-btn {
+    background-color: transparent;
+    border: 0;
+}
+.modal-fields {
+    padding-top: 20px;
+}
+.form-actions {
+    padding-bottom: 20px;
+}
+#app {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+}
+#app .block {
+    min-width: 200px;
+    box-sizing: border-box;
+    margin-right: 20px;
+}
+#app .box.modal-content {
+    border-radius: 6px;
+}
+#app .block .modal-dialog {
+    width: 100%;
+    margin: 0;
+}
+#app .box-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-right: 10px;
+    padding-left: 10px;
+}
+#app .box-header button.close:active {
+    opacity: 0.2;
+}
+#app .box-body ul {
+    padding: 0;
+    list-style: none;
+}
+#app .box-body ul li {
+    padding: 5px;
+    text-align: left;
+}
+.btn-static {
+    display: none;
+}
+</style>
+</div>
+
+{% block box_script %}
+
+<script type="text/javascript">
+
+$(function(){
+    var enableSwitch = $("input[name='switch_btn']").bootstrapSwitch();
+    var is_init = 0;
+    getEnableStatus();
+    function getEnableStatus() {
+        $.ajax({
+            url: '/api/v1/cloud/az/udrpoller/status/',
+            type: 'GET',
+            dataType: 'json',
+            success: function (res) {
+                if (typeof(res["is_running"]) == "undefined") {
+                    return;
+                }
+                enableSwitch.bootstrapSwitch('setState', res["is_running"]);
+                is_init++;
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+    enableSwitch.on('switch-change', function(e, data) {
+        if (is_init < 1) {
+            return;
+        }
+        $('#frame_model_main .btn-static').fadeIn("slow");
+        if ($(".btn-static").is(":visible")) {
+            var buttonH = $(".btn-static").offset().top;  
+            $(function(){ 
+                $(window).scroll(function(){ 
+                    var scrollH = $(this).scrollTop();  
+                    if (scrollH >= buttonH) {
+                        $(".btn-switch").addClass("btn-fixed");
+                    }else{  
+                        $(".btn-switch").removeClass("btn-fixed");
+                    } 
+                });
+            });
+        }
+    });
+    $('.btn-cancel-action').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        refreshPage();
+    });
+    $('.btn-submit').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        var enable = enableSwitch.bootstrapSwitch('state'); // true / false
+        $.ajax({
+            url: '/api/v1/cloud/az/udrpoller/',
+            type: 'PUT',
+            dataType: 'json',
+            data: JSON.stringify({
+                status: (enable ? 'on' : 'off')
+            }),
+            success: function (res) {
+                refreshPage();
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    });
+    var modal_fields = [{
+        field: '{% trans %}Sub ID{% endtrans %}',
+        id: 'sub_id',
+        value: ''
+    }, {
+        field: '{% trans %}Resource Grop Name{% endtrans %}',
+        id: 'res_grp_name',
+        value: ''
+    }, {
+        field: '{% trans %}Monitored VM Name{% endtrans %}',
+        id: 'vm_name',
+        value: ''
+    }, {
+        field: '{% trans %}Target IP When Running{% endtrans %}',
+        id: 'ip_running',
+        value: ''
+    }, {
+        field: '{% trans %}Target IP When Deallocated{% endtrans %}',
+        id: 'ip_deallocated',
+        value: ''
+    }];
+    // for displaying fields in each block
+    var show_fields = []; // for displaying fields in each block
+    is_show_field_title = false;
+
+    $('.add-btn').click(function() {
+        var content = setContent(modal_fields);
+        $('.modal-fields').html(content);
+        $('#addModal').modal();
+    });
+    var config = [];
+    $('.btn-save').click(function(evt) {
+        if(evt.detail && evt.detail != 1) {
+            return;
+        }
+        var each = {};
+        $('.field').each(function() {
+            if ($(this).val() == "") {
+                return;
+            }
+            each[$(this).data('id')] = $(this).val();
+        });
+        if (Object.keys(each).length < 1) {
+            return;
+        }
+        addUDR(each.sub_id, each.res_grp_name, each.vm_name, each.ip_running, each.ip_deallocated);
+    });
+
+    getInit();
+    function getInit() {
+        $.ajax({
+            url: '/api/v1/cloud/az/udrconfig/',
+            type: 'GET',
+            dataType: 'json',
+            success: function(res) {
+                for (var index in res) {
+                    config.push({
+                        primary_key: index,
+                        sub_id: res[index].subscription_id,
+                        res_grp_name: res[index].resource_group_name,
+                        vm_name: res[index].monitored_vm_name,
+                        ip_running: res[index].target_ip_when_running,
+                        ip_deallocated: res[index].target_ip_when_deallocated
+                    })
+                }
+                updateBlockList(config, show_fields, is_show_field_title);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+
+    /**
+     * Return html string for content of pop up window(Add)
+     * @param array setting: array for each setting
+     * @return string
+     */
+    function setContent(setting) {
+        var html = [];
+        for (var ind = 0; ind < setting.length; ++ind) {
+            var each = setting[ind];
+            html.push([
+                '<fieldset>',
+                    '<div class="group_actions"></div>',
+                        '<div class="form-group">',
+                        '<label class="col-md-3 control-label">',
+                            setting[ind].field,
+                        ':</label>',
+                        '<div class="col-md-9">',
+                            '<input type="text" class="field" data-id="' + setting[ind].id,
+                            '" value="' + setting[ind].value + '" />',
+                        '</div>',
+                    '</div>',
+                '</fieldset>'
+            ].join(""));
+        }
+        return html.join("");
+    }
+
+    /**
+     * Update layout for each blocks
+     * @param array setting: array of block information
+     * @param array fields: array of displaying fields, empty is all
+     * @param bool value_only: display value or [field: value] for each list
+     * @return void
+     */
+    function updateBlockList(setting, fields = [], value_only = true) {
+        var html = [];
+        var nameMapping = getNameMapping(); // ex: sub_id: SubId
+        for (var ind = 0; ind < setting.length; ++ind) {
+            var list = [];
+            for (var field in setting[ind]) {
+                if (fields.length !== 0 && fields.indexOf(field) === -1) {
+                    // Not display
+                    continue;
+                }
+                if (field == "primary_key") {
+                    // Not display
+                    continue;
+                }
+                var content = setting[ind][field];
+                if (!value_only) {
+                    var display_name = "";
+                    if (nameMapping.hasOwnProperty(field)) {
+                        display_name = nameMapping[field];
+                    }
+                    content = display_name + ": " + content;
+                }
+                list.push([
+                    '<li data-id="' + field + '">' + content + '</li>'
+                ].join(""));
+            }
+            html.push([
+                '<div class="block">',
+                    '<div class="modal-dialog">',
+                        '<div class="box modal-content">',
+                            '<div class="box-header">',
+                                '<span>' + setting[ind]['primary_key'] + '</span>',
+                                '<button type="button" class="close" aria-label="Close"',
+                                    'data-id="' + setting[ind]['primary_key'] + '">',
+                                    '<span aria-hidden="true">&times;</span></button>',
+                            '</div>',
+                            '<div class="box-body">',
+                                '<ul>',
+                                    list.join(""),
+                                '</ul>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join(""));
+        }
+        $('#app').html(html.join(""));
+        $('#app .block .box-header button').click(function() {
+            var index = parseInt($(this).data("id"));
+            delUDR(index);
+        });
+    }
+
+    function addUDR(sub_id, res_grp_name, vm_name, ip_running, ip_deallocated) {
+        $.ajax({
+            url: '/api/v1/cloud/az/udrconfig/',
+            type: 'POST',
+            dataType: 'json',
+            data: JSON.stringify({
+                sub_id: sub_id,
+                res_grp_name: res_grp_name,
+                vm_name: vm_name,
+                ip_running: ip_running,
+                ip_deallocating: ip_deallocated
+            }),
+            success: function(res) {
+                $('#addModal').modal('hide');
+                setTimeout(function() {
+                    refreshPage();
+                }, 400);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                $('#addModal').modal('hide');
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+
+    function delUDR(index) {
+        $.ajax({
+            url: '/api/v1/cloud/az/udrconfig/',
+            type: 'DELETE',
+            dataType: 'json',
+            data: JSON.stringify({
+                index: index
+            }),
+            success: function(res) {
+                refreshPage();
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                console.log(textStatus + "," + errorThrown + "," + xhr.responseText);
+            }
+        });
+    }
+
+    /**
+     * Get Display name mapping by index
+     * @return object
+     */
+    function getNameMapping() {
+        var mapping = {};
+        for (var ind = 0; ind < modal_fields.length; ++ind) {
+            mapping[modal_fields[ind].id] = modal_fields[ind].field;
+        }
+        return mapping;
+    }
+
+    function refreshPage() {
+        $('.config-nav li.active a').trigger('click');
+    }
+
+});
+
+</script>
+{% endblock box_script %}
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/tree.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/tree.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/tree.py	(working copy)
@@ -458,6 +458,9 @@
             ('synchronization', {'cls':ModelNode, 'model':'ha.synconfig.SynconfigGeneralSettings'}),
             ('IncrementalSynconfig', {'cls':ModelNode, 'model':'ha.synconfig.IncrementalSynconfig'}),
         ])}),
+        ('cloud', {'cls':MenuNode, 'verbose_name':_('Cloud'),'sub_nodes':D([
+            ('azure', {'cls':ModuleNode, 'default_action':'index', 'package':''}),
+        ])}),
     ])}),
             
     ('ajax', {'cls':MenuNode, 'hidden':True, 'sub_nodes':D([
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/urls.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/urls.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/apv/urls.py	(working copy)
@@ -47,4 +47,5 @@
     url(r'^generate_report$', generateReport),
     url(r'^%s/get_listener_list$' % PRODUCT_KEYWORD, get_listener_list),
     url(r'^%s/get_sslo_status$' % PRODUCT_KEYWORD, get_sslo_status),
+    url(r'^%s/get_cloud_page$' % PRODUCT_KEYWORD, get_cloud_page),
 )
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/djproject/settings.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/djproject/settings.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/djproject/settings.py	(working copy)
@@ -93,9 +93,10 @@
 )
 
 MIDDLEWARE_CLASSES = (
+
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
-    #'django.middleware.csrf.CsrfViewMiddleware',
+    # 'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     # Uncomment the next line for simple clickjacking protection:
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/djproject/urls.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/djproject/urls.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/djproject/urls.py	(working copy)
@@ -38,6 +38,7 @@
     url(r'^ChartExport/(?P<file_name>.*)$', ChartExport),
     url(r'^jsi18n/$', javascript_catalog, js_info_dict),
     url(r'^api/tests/(?P<app>\w+)/(?P<path>.*)$', TestHander),
+    url(r'^api/v1/cloud/', include("hive.cloud.urls")),
     url(r'^api/(?P<app>\w+)/(?P<path>.*)$', hive_ajax_router),
     url(r'^tsdb/query$', query_metrics),
     url(r'^statistics/query$', query_statistics),
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/__init__.py	(added)
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/__init__.py	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/__init__.py	(revision 0)
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_basic_view.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_basic_view.py	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_basic_view.py	(working copy)
@@ -0,0 +1,125 @@
+from django.http import HttpResponse
+import subprocess, os, time, json, re
+from hive.utils import aninfo, anerror
+
+def logout(request):
+    command = "python3 /ca/bin/azure/AZAuthManager.py -mode logout"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    aninfo("hive.debug","log out az account")
+    response = {
+        "message":"success to log out"
+    }
+    return HttpResponse(
+        json.dumps(response),
+        content_type="application/json", 
+        status=200
+    )
+    
+def get_login_code(request):
+    '''This is used to get the azure log in url and its code.
+    User can use this url and code to authenticate our app.
+    Eighter url and code cannot be resolve by regular express will retrun status code 500.
+    The way to run the az tool is to code the az tool API, and read the information from the related content from the file where API stores the output.
+    This method doesn't directly call Array CLI because of the limitation of architecture.'''
+
+    # launch process and read the content of file
+    file_path = "/tmp/login_msg.txt"
+    count = 0
+    fp = None
+    if os.path.exists(file_path):
+        os.remove(file_path)
+    command = "python3 /ca/bin/azure/AZAuthManager.py -mode login"
+    subprocess.Popen(command, shell=True)
+        
+    # Wait for the file to become available, up to 60 seconds
+    while fp is None and count < 60:
+        if os.path.exists(file_path):
+            fp = open(file_path, "r")
+        else:
+            time.sleep(1)
+            count += 1
+    msg = ""     
+    if fp is not None:
+        for line in fp:
+            msg+=line
+        fp.close() 
+            
+    # extract the url and code by regrex to form json response 
+    url = ""
+    code = ""
+    url_pattern = r'https?:\/\/[^\s]+'
+    code_pattern = r'code\s([A-Za-z0-9]+)'
+    code_match = re.search(code_pattern, msg)
+    if code_match:
+        code = code_match.group(1)
+    else:
+        error_response = {
+            "message": "Not Found code",
+        }
+        anerror("hive.debug", error_response)
+        return HttpResponse(
+        error_response,
+        content_type="application/json", 
+        status=500
+    )
+    url_match = re.search(url_pattern, msg)
+    if url_match:
+        url = url_match.group(0)
+    else:
+        error_response = {
+            "message": "Not Found url",
+        }
+        anerror("hive.debug", error_response)
+        return HttpResponse(
+        error_response,
+        content_type="application/json", 
+        status=500
+    )
+        
+    response_data = {
+        "url": url,
+        "code": code
+    }
+    return HttpResponse(
+        json.dumps(response_data),
+        content_type="application/json", 
+        status=200
+    )
+    
+def get_login_status(request):
+    '''Use to get login status.
+    return statuscode=401 if az tool return nothiing, which meaning that use haven't login.
+    return statuscode=200 if user have logged in. return all 
+    '''
+    command = "python3 /ca/bin/azure/AZAuthManager.py -mode show"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    response_data = {
+        "status":True
+    }
+    try:
+        json.loads(stdout.decode())
+    except Exception as e:
+        anerror("hive.debug", "Fail to decode return to json:{}".format(e))
+        response_data["status"] = False
+        return HttpResponse(
+            json.dumps(response_data),
+            content_type="application/json", 
+            status=200
+        )
+    aninfo("hive.debug", response_data)
+        
+    return HttpResponse(
+        json.dumps(response_data),
+        # stdout.decode(),
+        content_type="application/json", 
+        status=200
+    )
\ No newline at end of file
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_log_view.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_log_view.py	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_log_view.py	(working copy)
@@ -0,0 +1,177 @@
+from django.http import HttpResponse
+import subprocess, os, json
+from hive.utils import aninfo, anerror
+import logging
+
+log_file_path = '/ca/webui/htdocs/new/logfile.log' 
+logging.basicConfig(
+    filename=log_file_path,            # Path to the log file
+    level=logging.DEBUG,               # Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
+    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',  # Log message format
+    datefmt='%Y-%m-%d %H:%M:%S'         # Date format in the logs
+)
+
+def get_all_log(request):
+    command = "python3 /ca/bin/azure/LoggerManager.py -mode show"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    aninfo("hive.debug", "get all log")
+    return HttpResponse(
+        json.dumps({"message":stdout}),
+            content_type="application/json", 
+            status=200
+        )
+
+def download_log_file(request):
+    command = "python3 /ca/bin/azure/LoggerManager.py -mode getlogpath"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+
+    log_file_path = stdout.replace("\n", "")
+    
+    if not os.path.exists(log_file_path):
+        return HttpResponse(
+        json.dumps({"message":"No log file found"}),
+            content_type="application/json", 
+            status=200
+        )
+    # Open the file in binary mode and prepare it for downloading
+    with open(log_file_path, 'rb') as file:
+        response = HttpResponse(file.read(), content_type='text/plain')  # Assuming the file is a log file (plain text)
+        response['Content-Disposition'] = 'attachment; filename="{}"'.format("az_tool.log")
+        response['Content-Length'] = os.path.getsize(log_file_path)
+        return response
+    
+    if is_running is None:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        ) 
+    aninfo("hive.debug", "download log file")
+    return HttpResponse(
+        json.dumps({"is_running":is_running}),
+        content_type="application/json", 
+        status=200
+    )
+
+def get_log_severity(request):
+    command = "python3 /ca/bin/azure/LoggerManager.py -level status"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    aninfo("hive.debug", "get log severity: {}".format(stdout.replace("\n", "")))
+    return HttpResponse(
+        json.dumps({"severity":stdout.replace("\n", "")}),
+        content_type="application/json", 
+        status=200
+    )
+def set_log_severity(request):
+    # verify user input
+    required_keys = ["severity"]
+    
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            ) 
+    allow_severity = ["debug", "info", "warning", "error"]
+    if not data["severity"] in allow_severity:
+        return HttpResponse(
+            json.dumps({"message":"status should be: {}".format(','.join(allow_severity))}),
+            content_type="application/json", 
+            status=400
+        )
+    # call az tools
+    command = 'python3 /ca/bin/azure/LoggerManager.py -level {}'.format(data["severity"])
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=201
+    )
+def get_log_status(request):
+    '''This method is used to check if az tool log functionality is on or off.'''
+    command = "python3 /ca/bin/azure/LoggerManager.py -mode status"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    is_on = {"True": True, "False": False}.get(stdout.replace("\n", ""))
+    aninfo("hive.debug", "get log status: {}".format(is_on))
+    return HttpResponse(
+        json.dumps({"is_on":is_on}),
+        content_type="application/json", 
+        status=200
+    )
+    
+def switch_log_status(request):
+    '''This method is used to set az tool log functionality to on or off.'''
+    # verify user input
+    required_keys = ["status"]
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            )
+
+    allow_status = ["on", "off"]
+    if not data["status"] in allow_status:
+        return HttpResponse(
+            json.dumps({"message":"status should be: {}".format(', or '.join(allow_status))}),
+            content_type="application/json", 
+            status=400
+        )
+    # use az tool
+    command = "python3 /ca/bin/azure/LoggerManager.py -mode {}".format(data["status"])
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    aninfo("hive.debug", "swtich log status to {}".format(data["status"]))
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=200
+    )
\ No newline at end of file
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_nic_view.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_nic_view.py	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_nic_view.py	(working copy)
@@ -0,0 +1,171 @@
+from django.http import HttpResponse
+import subprocess, json
+from hive.utils import aninfo, anerror
+
+def get_all_nic_config(request):
+    command = "python3 /ca/bin/azure/ConfigManager.py -mode getipconfig"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    aninfo("hive.debug", stdout)
+    try:
+        return HttpResponse(
+                json.dumps(json.loads(stdout.decode().replace("'", '"'))),
+                content_type="application/json", 
+                status=200
+        )
+    except Exception as e:
+        anerror("hive.debug", str(e)+". Got "+stdout)
+        return HttpResponse(
+                json.dumps({}),
+                content_type="application/json", 
+                status=200
+        )
+    
+def delete_nic_config_by_index(request):
+    required_keys = ["index"]
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            ) 
+    # call az tools
+    command = 'python3 /ca/bin/azure/ConfigManager.py -mode clear -index {}'.format(data["index"])
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    aninfo("hive.debug", "delete nic with index: {}".format(data["index"]))
+    
+    return HttpResponse(
+        json.dumps({"message":stdout}),
+        content_type="application/json", 
+        status=201
+    )
+
+def add_nic_config(request):
+    '''add nic ip configuration'''
+    # verify user input
+    required_keys = ["sub_id", "res_grp_name", "src_nic_name", "dest_nic_name"]
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            ) 
+    # call az tools
+    command = 'python3 /ca/bin/azure/ConfigManager.py -mode set -sub_id {} -res_grp_name {} -src_nic_name {} -dest_nic_name {}'.format(data["sub_id"], data["res_grp_name"], data["src_nic_name"], data["dest_nic_name"])
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+    )
+    aninfo("hive.debug", "add nic: {}".format(data))
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=201
+    )
+    
+
+def get_nic_poller_status(request):
+    command = "python3 /ca/bin/azure/AZFailoverPoller.py -mode 3"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    
+    is_running = {"True": True, "False": False}.get(stdout.replace("\n", ""))
+    aninfo("hive.debug", "get nic poller status: {}".format(is_running))
+    if is_running is None:
+        anerror("hive.debug", "fail to resolve ".format(stdout.replace("\n", "")))
+        
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        ) 
+    return HttpResponse(
+        json.dumps({"is_running":is_running}),
+        content_type="application/json", 
+        status=200
+    )
+def switch_nic_poller(request):
+    # verify user input
+    required_keys = ["status"]
+
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            )
+    # use az tool
+    status = {"on": "1", "off": "2"}.get(data["status"])
+    command = "python3 /ca/bin/azure/AZFailoverPoller.py -mode {}".format(status)
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    aninfo("hive.debug", "switch nic poller to {}".format(data["status"]))
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=200
+    )
+def trigger_ip_transfering(request):
+    # verify user input
+    required_keys = ["status"]
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            )
+    
+    allow_status = ["failover", "recover"]
+    if not data["status"] in allow_status:
+        return HttpResponse(
+            json.dumps({"message":"status should be: {}".format(', or '.join(allow_status))}),
+            content_type="application/json", 
+            status=400
+        )
+    # use az tool
+    status = {"failover": "1", "recover": "2"}.get(data["status"])
+    command = "python3 /ca/bin/azure/AZFailoverManager.py -mode {}".format(status)
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    
+    if stderr:
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    aninfo("hive.debug", "trigger ip transfering {}".format(data["status"]))
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=200
+    )
\ No newline at end of file
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_udr_view.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_udr_view.py	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/az_udr_view.py	(working copy)
@@ -0,0 +1,149 @@
+from django.http import HttpResponse
+import subprocess, json, os
+from hive.utils import aninfo, anerror
+
+def switch_udr_poller(request):
+    # verify user input
+    required_keys = ["status"]
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            )
+    allow_status = ["on", "off"]
+    if not data["status"] in allow_status:
+        return HttpResponse(
+            json.dumps({"message":"status should be: {}".format(', or '.join(allow_status))}),
+            content_type="application/json", 
+            status=400
+        )
+
+    # use az tool
+    status = {"on": "1", "off": "2"}.get(data["status"])
+    command = "python3 /ca/bin/azure/UDRPoller.py -mode {}".format(status)
+    res = subprocess.Popen(command.split(), stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w'))
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    aninfo("hive.debug", "swtich udr status to {}".format(data["status"]))
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=200
+    )
+    
+def get_udr_poller_status(request):
+    command = "python3 /ca/bin/azure/UDRPoller.py -mode 3"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        )
+    is_running = {"True": True, "False": False}.get(stdout.replace("\n", ""))
+    if is_running is None:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+        ) 
+    aninfo("hive.debug", "get udr poller status {}".format(is_running))
+    return HttpResponse(
+        json.dumps({"is_running":is_running}),
+        content_type="application/json", 
+        status=200
+    )
+    
+def add_udr_config(request):
+    '''add udr ip configuration'''
+    # verify user input
+    required_keys = ["sub_id", "res_grp_name", "vm_name", "ip_running", "ip_deallocating"]
+    
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            ) 
+    # call az tools
+    command = 'python3 /ca/bin/azure/RouteConfigManager.py -mode set -sub_id {} -res_grp_name {} -vm_name {} -ip_running {} -ip_deallocating {}'.format(data["sub_id"], data["res_grp_name"], data["vm_name"], data["ip_running"], data["ip_deallocating"])
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+    )
+    aninfo("hive.debug", "swtich udr status to {}".format(data["status"]))
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=201
+    )
+    
+def delete_udr_config(request):
+    '''delete udr configuration'''
+    required_keys = ["index"]
+    data = json.loads(request.body)
+    for key in required_keys:
+        if key not in data:
+            return HttpResponse(
+                json.dumps({"message":"body should contain key: {}".format(', '.join(required_keys))}),
+                content_type="application/json", 
+                status=400
+            ) 
+    # call az tools
+    command = 'python3 /ca/bin/azure/RouteConfigManager.py -mode clear -index {}'.format(data["index"])
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    if stderr:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+        json.dumps({"message":"error while running az tools"}),
+            content_type="application/json", 
+            status=500
+    )
+    aninfo("hive.debug", "delete udr config with index: {}".format(data["index"]))
+    return HttpResponse(
+        json.dumps({"message":"succeed"}),
+        content_type="application/json", 
+        status=200
+    )
+def get_udr_config(request):
+    command = "python3 /ca/bin/azure/RouteConfigManager.py -mode getrouteconfig"
+    res = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    stdout, stderr = res.communicate()
+    try:
+        udr_config = json.dumps(json.loads(stdout.decode().replace("'", '"')))
+        aninfo("hive.debug", "get udr config")
+        return HttpResponse(
+                udr_config,
+                content_type="application/json", 
+                status=200
+        )
+    except Exception as e:
+        anerror("hive.debug", stderr)
+        return HttpResponse(
+                json.dumps({}),
+                content_type="application/json", 
+                status=200
+        )
+        
+if __name__=="__main__":
+    pass
\ No newline at end of file
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/urls.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/urls.py	(revision 0)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/cloud/urls.py	(working copy)
@@ -0,0 +1,104 @@
+
+from django.http import HttpResponse
+import json
+from django.conf.urls import patterns, url
+from hive.cloud.az_basic_view import get_login_code, get_login_status, logout
+from hive.cloud.az_nic_view import get_all_nic_config, add_nic_config, delete_nic_config_by_index, get_nic_poller_status, switch_nic_poller, trigger_ip_transfering
+from hive.cloud.az_udr_view import switch_udr_poller, add_udr_config, delete_udr_config, get_udr_config, get_udr_poller_status
+from hive.cloud.az_log_view import get_all_log, get_log_status, download_log_file, switch_log_status, get_log_severity, set_log_severity
+def get_bad_http_method():
+    return HttpResponse(
+        json.dumps({"message":"Bad http method"}),
+        content_type="application/json", 
+        status=400
+    )
+    
+def az_nicconfig_method_router(request):
+    if request.method=="GET":
+        return get_all_nic_config(request)
+    elif request.method=="POST":
+        return add_nic_config(request)
+    elif request.method=="DELETE":
+        return delete_nic_config_by_index(request)
+    return get_bad_http_method()
+
+def az_login_method_router(request):
+    if request.method=="GET":
+        return get_login_code(request)
+    return get_bad_http_method()
+    
+def az_login_status_method_router(request):
+    if request.method=="GET":
+        return get_login_status(request)
+    return get_bad_http_method()
+
+def az_logout_method_router(request):
+    if request.method=="POST":
+        return logout(request)
+    return get_bad_http_method()
+
+def az_nicpoller_status_method_router(request):
+    if request.method=="GET":
+        return get_nic_poller_status(request)
+    return get_bad_http_method()
+
+def az_nicpoller_method_router(request):
+    if request.method=="PUT":
+        return switch_nic_poller(request)
+    return get_bad_http_method()
+
+def az_nictrigger_method_router(request):
+    if request.method=="PUT":
+        return trigger_ip_transfering(request)
+    return get_bad_http_method()
+
+def az_udrpoller_method_router(request):
+    if request.method=='PUT':
+        return switch_udr_poller(request)
+def az_udrpoller_status_method_router(request):
+    if request.method=='GET':
+        return get_udr_poller_status(request)
+def az_udrconfig_method_router(request):
+    if request.method=="GET":
+        return get_udr_config(request)
+    elif request.method=="POST":
+        return add_udr_config(request)
+    elif request.method=="DELETE":
+        return delete_udr_config(request)
+    return get_bad_http_method()
+def az_logfile_method_router(request):
+    if request.method=="GET":
+        return download_log_file(request)
+    return get_bad_http_method()
+def az_log_method_router(request):
+    if request.method=="GET":
+        return get_all_log(request)
+    return get_bad_http_method()
+def az_log_status_method_router(request):
+    if request.method=="GET":
+        return get_log_status(request)
+    if request.method=="PUT":
+        return switch_log_status(request)
+    return get_bad_http_method()
+def az_log_severity_method_router(request):
+    if request.method=="GET":
+        return get_log_severity(request)
+    if request.method=="PUT":
+        return set_log_severity(request)
+    return get_bad_http_method()
+urlpatterns = patterns('',
+    url(r'^az/login/$', az_login_method_router),
+    url(r'^az/login/status/$', az_login_status_method_router),
+    url(r'^az/logout/$', az_logout_method_router),
+    url(r'^az/nicconfig/$', az_nicconfig_method_router),
+    url(r'^az/nicpoller/status/$', az_nicpoller_status_method_router),
+    url(r'^az/nicpoller/$', az_nicpoller_method_router),
+    url(r'^az/nictrigger/$', az_nictrigger_method_router),
+    url(r'^az/udrpoller/$', az_udrpoller_method_router),
+    url(r'^az/udrpoller/status/$', az_udrpoller_status_method_router),
+    url(r'^az/udrconfig/$', az_udrconfig_method_router),
+    url(r'^az/logfile/$', az_logfile_method_router),
+    url(r'^az/log/$', az_log_method_router),
+    url(r'^az/log/status/$', az_log_status_method_router),
+    url(r'^az/log/severity/$', az_log_severity_method_router),
+)
\ No newline at end of file
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/session.py
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/session.py	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/session.py	(working copy)
@@ -868,3 +868,4 @@
                     self.update_cookie(cookie, request, response)
 
         return response
+    
\ No newline at end of file
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/templates/base.html
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/templates/base.html	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/hive/templates/base.html	(working copy)
@@ -11,14 +11,14 @@
     var APPNAME = "{{ APPNODE.name }}";
     </script>
     <script src="{{ MEDIA }}js/require.js"></script>
-    <script src="{{ MEDIA }}js/config.js?v=__BaseVersion__"></script>
+    <script src="{{ MEDIA }}js/config.js?v=1734314168"></script>
     <script src="{{ MEDIA }}js/jsi18n/{{ LANGUAGE_CODE }}/djangojs.js"></script>
     <script src="{{ MEDIA }}js/build/InfosecNetSignCNGAgent.min.js"></script>
     <!--<link rel="stylesheet/less" href="{{ MEDIA }}less/themes/default/master.less" />
     <script src="{{ MEDIA }}js/less-1.6.0.min.js"></script>-->
     <link rel="stylesheet" href="{{ MEDIA }}encore/encore.min.css">
     <link rel="stylesheet" href="{{ MEDIA }}/js/icheck/blue.css">
-    <link rel="stylesheet" href="{{ MEDIA }}css/themes/{{ SESSION.theme }}/master.css?v=__BaseVersion__">
+    <link rel="stylesheet" href="{{ MEDIA }}css/themes/{{ SESSION.theme }}/master.css?v=1734314168">
     <link rel="stylesheet" href="{{ MEDIA }}icomoon/style.css">
     <link rel="stylesheet" href="{{ MEDIA }}css/messenger.css">
     <link rel="stylesheet" href="{{ MEDIA }}css/messenger-theme-future.css">
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/en/LC_MESSAGES/django.po
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/en/LC_MESSAGES/django.po	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/en/LC_MESSAGES/django.po	(working copy)
@@ -5597,6 +5597,87 @@
 msgid "Authentication Server is required."
 msgstr ""
 
+msgid "Cloud"
+msgstr ""
+
+msgid "Log"
+msgstr ""
+
+msgid "Login Url"
+msgstr ""
+
+msgid "Logged in"
+msgstr ""
+
+msgid "Not logged in"
+msgstr ""
+
+msgid "Code"
+msgstr ""
+
+msgid "Internal error, please refresh the page."
+msgstr ""
+
+msgid "Refresh"
+msgstr ""
+
+msgid "Log Out"
+msgstr ""
+
+msgid "Please login using the above information in 1 minute."
+msgstr ""
+
+msgid "After 1 minute the login credential will be clear."
+msgstr ""
+
+msgid "WARNING: To sign in, use a web browser to open the page "
+msgstr ""
+
+msgid " and enter the code "
+msgstr ""
+
+msgid " to authenticate."
+msgstr ""
+
+msgid "Manual Trigger"
+msgstr ""
+
+msgid "Failover"
+msgstr ""
+
+msgid "Recover"
+msgstr ""
+
+msgid "Sub ID"
+msgstr ""
+
+msgid "Resource Grop Name"
+msgstr ""
+
+msgid "Source NIC Name"
+msgstr ""
+
+msgid "Destination NIC Name"
+msgstr ""
+
+msgid "Level"
+msgstr ""
+
+msgid "Debug"
+msgstr ""
+
+msgid "Info"
+msgstr ""
+
+msgid "Download"
+msgstr ""
+
+msgid "On"
+msgstr ""
+
+msgid "Off"
+msgstr ""
+
 #~ msgid "Graphs"
 #~ msgstr ""
 
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/ja/LC_MESSAGES/django.po
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/ja/LC_MESSAGES/django.po	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/ja/LC_MESSAGES/django.po	(working copy)
@@ -5645,6 +5645,87 @@
 msgid "Authentication Server is required."
 msgstr "認証サーバーは必要です。"
 
+msgid "Cloud"
+msgstr "クラウドサービス"
+
+msgid "Log"
+msgstr "ログ"
+
+msgid "Login Url"
+msgstr "ログインURL"
+
+msgid "Logged in"
+msgstr "ログイン済み"
+
+msgid "Not logged in"
+msgstr "ログインしていません"
+
+msgid "Code"
+msgstr "コード"
+
+msgid "Internal error, please refresh the page."
+msgstr "内部エラーが発生しました。ページを再読み込みしてください。"
+
+msgid "Refresh"
+msgstr "更新効力"
+
+msgid "Log Out"
+msgstr "ログアウト"
+
+msgid "Please login using the above information in 1 minute."
+msgstr "上記の情報を使って1分以内にログインしてください。"
+
+msgid "After 1 minute the login credential will be clear."
+msgstr "ログイン認証情報は1分後に削除されます。"
+
+msgid "WARNING: To sign in, use a web browser to open the page "
+msgstr "警告：ログインするには、ウェブブラウザでこのページ "
+
+msgid " and enter the code "
+msgstr " を開いてくだ。そして、認証コード「"
+
+msgid " to authenticate."
+msgstr "」を入力して認証を行ってください。"
+
+msgid "Manual Trigger"
+msgstr "手動で起動する"
+
+msgid "Failover"
+msgstr "フェイルオーバー"
+
+msgid "Recover"
+msgstr "復旧"
+
+msgid "Sub ID"
+msgstr "購読ID"
+
+msgid "Resource Grop Name"
+msgstr "リソースグループ名"
+
+msgid "Source NIC Name"
+msgstr "ソースNIC名"
+
+msgid "Destination NIC Name"
+msgstr "宛先NIC名"
+
+msgid "Level"
+msgstr "レベル"
+
+msgid "Debug"
+msgstr "デバッグ"
+
+msgid "Info"
+msgstr "情報"
+
+msgid "Download"
+msgstr "ダウンロード"
+
+msgid "On"
+msgstr "開く"
+
+msgid "Off"
+msgstr "閉じる"
+
 #~ msgid "L2 Bridge"
 #~ msgstr "L2ブリッジ"
 
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/zh_CN/LC_MESSAGES/django.po
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/zh_CN/LC_MESSAGES/django.po	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/zh_CN/LC_MESSAGES/django.po	(working copy)
@@ -5627,6 +5627,87 @@
 msgid "Authentication Server is required."
 msgstr "认证服务器不能为空。"
 
+msgid "Cloud"
+msgstr "云服务"
+
+msgid "Log"
+msgstr "日志"
+
+msgid "Login Url"
+msgstr "登录网址"
+
+msgid "Logged in"
+msgstr "已登录"
+
+msgid "Not logged in"
+msgstr "未登录"
+
+msgid "Code"
+msgstr "代码"
+
+msgid "Internal error, please refresh the page."
+msgstr "内部错误，请刷新页面。"
+
+msgid "Refresh"
+msgstr "刷新效力"
+
+msgid "Log Out"
+msgstr "登出"
+
+msgid "Please login using the above information in 1 minute."
+msgstr "请在1分钟内使用上述信息登录。"
+
+msgid "After 1 minute the login credential will be clear."
+msgstr "登录凭证将在1分钟后清除。"
+
+msgid "WARNING: To sign in, use a web browser to open the page "
+msgstr "提醒：请使用浏览器打开这个网址进行登录操作。"
+
+msgid " and enter the code "
+msgstr "，并且输入代码「"
+
+msgid " to authenticate."
+msgstr "」进行认证。"
+
+msgid "Manual Trigger"
+msgstr "手动触发"
+
+msgid "Failover"
+msgstr "失效转移"
+
+msgid "Recover"
+msgstr "恢复"
+
+msgid "Sub ID"
+msgstr "订阅ID"
+
+msgid "Resource Grop Name"
+msgstr "资源组名称"
+
+msgid "Source NIC Name"
+msgstr "源网卡名称"
+
+msgid "Destination NIC Name"
+msgstr "目标网卡名称"
+
+msgid "Level"
+msgstr "级别"
+
+msgid "Debug"
+msgstr "调试"
+
+msgid "Info"
+msgstr "信息"
+
+msgid "Download"
+msgstr "下载"
+
+msgid "On"
+msgstr "开启"
+
+msgid "Off"
+msgstr "关闭"
+
 #~ msgid "Graphs"
 #~ msgstr "图表"
 
Index: /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/zh_TW/LC_MESSAGES/django.po
===================================================================
--- /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/zh_TW/LC_MESSAGES/django.po	(revision 38845)
+++ /branches/rel_apv_10_7_0_21_pre_sight/usr/click/webui/htdocs/new/src/locale/zh_TW/LC_MESSAGES/django.po	(working copy)
@@ -5635,6 +5635,87 @@
 msgid "Authentication Server is required."
 msgstr "認證服務器不能為空。"
 
+msgid "Cloud"
+msgstr "雲端服務"
+
+msgid "Log"
+msgstr "日誌"
+
+msgid "Login Url"
+msgstr "登入網址"
+
+msgid "Logged in"
+msgstr "已登入"
+
+msgid "Not logged in"
+msgstr "未登入"
+
+msgid "Code"
+msgstr "代碼"
+
+msgid "Internal error, please refresh the page."
+msgstr "內部錯誤，請重新整理網頁。"
+
+msgid "Refresh"
+msgstr "刷新時效"
+
+msgid "Log Out"
+msgstr "登出"
+
+msgid "Please login using the above information in 1 minute."
+msgstr "請在1分鐘內使用上述資訊登入。"
+
+msgid "After 1 minute the login credential will be clear."
+msgstr "登入憑證將在1分鐘後清除。"
+
+msgid "WARNING: To sign in, use a web browser to open the page "
+msgstr "提醒：請使用瀏覽器打開這個網址進行登入動作:"
+
+msgid " and enter the code "
+msgstr "，並且輸入代碼「"
+
+msgid " to authenticate."
+msgstr "」以進行認證。"
+
+msgid "Manual Trigger"
+msgstr "手動觸發"
+
+msgid "Failover"
+msgstr "故障切換"
+
+msgid "Recover"
+msgstr "恢復"
+
+msgid "Sub ID"
+msgstr "訂閱ID"
+
+msgid "Resource Grop Name"
+msgstr "資源群組名稱"
+
+msgid "Source NIC Name"
+msgstr "源網卡名稱"
+
+msgid "Destination NIC Name"
+msgstr "目標網卡名稱"
+
+msgid "Level"
+msgstr "級別"
+
+msgid "Debug"
+msgstr "除錯"
+
+msgid "Info"
+msgstr "一般訊息"
+
+msgid "Download"
+msgstr "下載"
+
+msgid "On"
+msgstr "開啟"
+
+msgid "Off"
+msgstr "關閉"
+
 #~ msgid "Graphs"
 #~ msgstr "圖表"
 
