Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.

Announcement

Collapse
No announcement yet.

Lab: Sử dụng python để tương tác với cisco sd-wan api

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Lab: Sử dụng python để tương tác với cisco sd-wan api

    1. Mô tả
    • Học viên thực hiện kết nối đến Sandbox SD-WAN (vManage), viết code để lấy danh sách thông tin các thiết bị bằng ngôn ngữ Python.
    1. Yêu cầu kĩ thuật
    • Cài đặt thư viện requests trên máy tính.
    • Kết nối đến SD-WAN vManage, thông tin Vmanage trong bài lab:
    1. [*=1]Host: https://sandbox-sdwan-1.cisco.com[*=1]Username: devnetuser[*=1]Password: RG!_Yw919_83
    • Viết code bằng Python thực hiện yêu cầu:
    + Đăng nhập và xác thực.
    + GET requests, POST requests.
    + Lấy danh sách thông tin các thiết bị trong Controller.
    1. Các bước thực hiện
    1. Cài đặt thư viện requests
    Bài lab sử dụng IDE Pycharm
    Vào phần Python Packages tìm kiếm thư viện requests và click install, thư viện sẽ được install vào virtualenv
    Click image for larger version

Name:	python1.png
Views:	65
Size:	25.9 KB
ID:	426013


    Nếu bạn sử dụng IDE khác, không phải Pycharm và virtualenv trong Pycharm
    Truy cập CMD nhập lệnh python -m pip install requests, cẩn thận chú ý phiên bản python và pip sử dụng để cài đặt thư viện
    Click image for larger version

Name:	python2.png
Views:	61
Size:	23.0 KB
ID:	426014



  • #2
    1. Đăng nhập và xác thực bằng Python code
    Chúng ta sẽ xây dựng các hàm và class trong Python để đăng nhập và xác thực, lợi thế của việc sử dụng hàm và class là việc tái sử dụng được code.

    Xây dựng hàm authentication
    Bước 1: Đầu tiên bạn cần xác định api endpoint cần trỏ đến, https://{{vmanage}} và sau đó đến phần resource /j_security_check. Giá trị đó sẽ được lưu trong một biến riêng biệt:
    • Biến base_url_str được dùng để chưa vManage endpoint ở định dạng chuỗi (string)
    • Biến login_action chứa địa chỉ resource login
    Bước 2: Chỉ định username và password trong một biến khác tên là login_data, cả 2 được lưu dưới dạng cặp key value hay còn gọi là dictionary trong Python.
    Tổng kết chúng ta có 3 biến được định nghĩa:
    base_url_str = f'https://{vmanage_ip}'

    login_action = '/j_security_check'

    login_data = {'j_username' : username, 'j_password' : password}
    Endpoint và resource được chia thành hai biến khác nhau. Nếu một trong hai cần thay đổi, bạn chỉ cần thay đổi ở một biến cụ thể.
    Bước 3: Tiếp theo bạn cần kết hợp 2 biến đó lại để hoàn thành login URL. Tến biến là login_url được kết hợp lại bởi base_url_str và login_action.
    login_url = base_url_str + login_action
    Bước 4: Để mở ra một session mới trong Python, chúng ta sử dụng phương thức session trong thư viện requests. Cùng với phương thức POST và thông tin j_username, j_password của biến login_data để gửi request đến vManage. Và nếu bạn không muốn kiểm tra chứng chỉ tự ký (self-signed certificates) thì có thế chuyển option verify thành False.
    sess = request.session()

    login_response = sess.post(url=login_url, data=login_data, verify=False)
    Bước 5: Chúng ta cần chỉ định rõ khi hàm login gửi request đi sẽ trả về thành công hay thất bại. Khi xác thực thành công hàm sẽ trả về 200 OK nhưng không có bất kỳ dữ liệu nào, khi xác thực thất bại Python sẽ trả về Login Failed trên màn hình và thoát khỏi hàm.
    if b'<html>' in login_response.content:
    print ("Login Failed")
    sys.exit(0)
    Hàm authentication sau khi hoàn thành
    Bạn đã xây dựng được một hàm để login và xác thực với Cisco SD-WAN. Hàm sẽ cần những tham số đầu vào sau: địa chỉ vManage, uername và password
    Code:
    def login(vmanage_ip, username, password):
    """Login to vmanage"""
    base_url_str = f'https://{vmanage_ip}'

    login_action = '/j_security_check'

    login_data = {'j_username' : username, 'j_password' : password}

    login_url = base_url_str + login_action

    sess = requests.session()

    login_response = sess.post(url=login_url, data=login_data, verify=False)

    if b'<html>' in login_response.content:
    print ("Login Failed")
    sys.exit(0)

    Comment


    • #3
      Kết quả trả về khi khai báo sai password và login thất bại:
      Click image for larger version

Name:	python3.png
Views:	56
Size:	28.4 KB
ID:	426017
      1. GET requests trong Python
      Phần này sẽ xây dựng một hàm tên get_request() gọi dữ liệu từ vManage REST API. Hàm sẽ nhận vào 2 tham số đó là địa chỉ ip của vManage và resource để trỏ đến data muốn lấy. phần resource đó sẽ được đặt trong tham số tên mount_point.
      Bước 1: Định nghĩa URL
      url = f'https://{vmanage_ip}/dataservice/{mount_point}'
      Bước 2: Sử dụng phương thức GET để thực hiện call api và lưu trữ trong biến response
      response = requests.request("GET", url, verify=False)
      data = response.content
      return data
      Bước 3: Kết hợp lại để xây dựng ra một hàm get_request() hoàn chỉnh:
      def get_request(vmanage_ip, mount_point):
      """GET request"""
      url = f'https://{vmanage_ip}/dataservice/{mount_point}'

      response = requests.request("GET", url, verify=False)
      data = response.content
      return data

      Comment


      • #4
        1. POST requests trong Python
        Tạo một hàm post_request(), hàm này sẽ nhận vào những tham số sau:
        • Địa chỉ ip vManage
        • Resource để gọi API
        • Payload
        • Phần Content-Type ở phần header được thực thi dưới dạng application/json
        Bước 1: Định nghĩa URL
        url = f'https://{vmanage_ip}/dataservice/{mount_point}'
        Bước 2: Payload data sẽ được gửi đi cùng với request được lấy tự tham số đầu vào của hàm post_requests()
        def post_request(vmanage_ip, mount_point, payload, headers={'Content-Type': 'application/json'}):
        url = f'https://{vmanage_ip}/dataservice/{mount_point}'
        payload = json.dumps(payload)
        Bước 3: Sử dụng phương thức POST gọi api và dữ liệu trả về được lưu trữ trong biến response. Phương thức json() được sử dụng để định dạng lại dữ liệu trả về cho người dùng.
        response = requests.request("POST", url, data=payload, headers=headers, verify=False)
        data = response.json()
        return data
        Bước 4: Kết hợp lại để xây dựng ra một hàm post_request() hoàn chỉnh:
        def post_request(vmanage_ip, mount_point, payload, headers={'Content-Type': 'application/json'}):
        """POST request"""
        url = f'https://{vmanage_ip}/dataservice/{mount_point}'
        payload = json.dumps(payload)

        response = requests.request("POST", url, data=payload, headers=headers, verify=False)
        data = response.json()
        return data

        Comment


        • #5
          1. Xấy dựng rest_api_lib Python class
          Chúng ta đã xậy dựng được 3 hàm để có thể tái sử dụng lại khi tương tác với vManage REST API:
          • login()
          • get_request()
          • post_request()

          Trong phần này chúng ta sẽ tạo ra class đầu tiên trong chương trình
          Class trong Python được định nghĩa cho một đối tượng bao gồm một tập các attributes (thuộc tính) đặc trưng cho tất cả các đối tượng của lớp. Attributes gồm: data members và methods được gọi thông qua ký hiệu dấu chấm.
          Hàm __init __ là method đặc biệt, gọi là constructor. Hàm này được Python tự động gọi khi một instance mới được tạo ra. Self đại diện cho một instance của một class, bạn có thể truy cập các thuộc tính và các phương thức của class thông qua self.

          Comment


          • #6
            Thực hiện:
            Bạn sẽ khởi tạo phương thức __init__ cùng với các thuộc tính cho địa chỉ ip vManage, một dict rỗng được tạo ra dành cho REST API session và sẽ được khởi tạo ở hàm login.
            Tiếp theo, bạn cần định nghĩa các phương thức của class rest_api_lib. Bạn có thể sử dụng lại các hàm đã được định nghĩa ở phần trước login(), get_request(), post_request().
            Bạn sẽ cần phải chỉnh sửa lại các hàm đó để có thể ghép vào class. Mỗi phương thức trong Python class cần có tham số self được truyền vào input. Bạn cũng cần phải lưu giữ lại giá trị session để có thể sử dụng nó cho các phương thức sau của class.
            Sau khi đã kết hợp tất cả các hàm cũng như tham số, ta sẽ có được class rest_api_lib như sau:

            class rest_api_lib:
            def __init__(self, vmanage_ip, username, password):
            self.vmanage_ip = vmanage_ip
            self.session = {}
            self.login(self.vmanage_ip, username, password)

            def login(self, vmanage_ip, username, password):
            """Login to vmanage"""
            base_url_str = f'https://{vmanage_ip}/dataservice/{mount_point}'


            login_action = '/j_security_check'

            #Format data for loginForm
            login_data = {'j_username' : username, 'j_password' : password}

            #Url for posting login data
            login_url = base_url_str + login_action
            url = base_url_str + login_url

            sess = requests.session()
            #If the vmanage has a certificate signed by a trusted authority change verify to True
            login_response = sess.post(url=login_url, data=login_data, verify=False)


            if b'<html>' in login_response.content:
            print ("Login Failed")
            sys.exit(0)

            self.session[vmanage_ip] = sess

            def get_request(self, mount_point):
            """GET request"""
            url = f'https://{self.vmanage_ip}/dataservice/{mount_point}'
            #print url
            response = self.session[self.vmanage_ip].get(url, verify=False)
            data = response.content
            return data

            def post_request(self, mount_point, payload, headers={'Content-Type': 'application/json'}):
            """POST request"""
            url = f'https://{self.vmanage_ip}/dataservice/{mount_point}'

            payload = json.dumps(payload)
            print (payload)

            response = self.session[self.vmanage_ip].post(url=url, data=payload, headers=headers, verify=False)
            data = response.json()
            return data

            Comment

            Working...
            X