네트워크 장비 제어를 위한 추상화 API - 2

dingdong·2022년 1월 15일
0

2019년 1월 9일
4명이서 1년 넘게 작업한 프로젝트를 폭발시켰다. 💣

그와 동일한 2019년 1월 9일
새로운 프로젝트를 만들었다. 🏁

미션을 받게 되었다. 📩
동료 한분과(총 2명) 2월 1일까지 📅
Core 로직 구현과
20여개 정도의 Feature API 구현
Prototype 의 절차를 만들어라.

그리고 이렇게 Prototype 으로 만들어진 것을 보고
2차 방법으로 갈지/말지에 대해서 선택하는 시간을 갖기로 하였다.



2차 방법: 고려 사항🤔

  • 1차 실패를 경험하고 고려사항이 늘어나게 되었다.

1) 코드 중복을 줄이고 싶다.

1) 장비별로 코드를 복사해서 CLI 가 다른부분만 바꿔준다. (비효율적이다.)
1차때 경험하게 되었다. 장비의 CLI 가 다양하기에 확장성을 고려해야된다.

2) 경험이 부족한 사람은 설정을 헤맨다. learning curve 를 줄여 주고 싶다.

2) CLI가 다르면 경험이 부족한 사람의 경우 설정 방법을 해맬 수 있다.

3) 명령 입력 전/후 모드 이동 문제

3) 1차 방법에서 문제였던 효율적인 모드 이동 필요

4) 장비의 Command 기능과 Session (telnet) 와의 의존성 문제

4) 1차방법에서는 기능(Feature) API 를 호출했을때
telnet session을 통해서 장비로 입력이 바로 전송되어었다.
기능(Feature) API 와 Session (telnet) 의존성을 줄인다.

5) SSH, Serial(direct) 사용이 필요해짐 (지원하는 Session 종류를 늘려야됨)

5) session 을 telnet, ssh, serial 로 만들어서 장비를 제어할 수 있어야됨.

6) 윈도우 환경에서도 API 사용이 필요해짐

6) 1차 방법때는 pexpect 를 이용해서 telnet을 접속했는데
pexpect를 이용해서 윈도우PC에서 장비로 telnet 접속이 안되어었다.



2차 방법: 추상화 접근 방법 ❗

아래와 같은 접근 방법으로 추상화를 디자인을 했었다.


장비 명세서 📄

장비A에 대해서 명세를 해준다.
장비A는 어떤 기능을 가지고 있고 ...
마치 장비에 대한 명세서라는 것을 작성하여
작성한 명세서를 통해서 장비가 인스턴스화 될 수 있도록 하게 하였다.

명세서 예시)
어떤_SESSION_COLLECTION: SESSION_COLLECTION_1
분류_기능: MainFeatureClass
  기능1: 기능1SubFeatureClass1
  기능2: 기능2SubFeatureClass2
...

Feature API 사용 방법 예시

  1. 분류를 한단계 더 추가하였다.
    1차 방법처럼 접근한다면 분류가 1개만 있으니깐
    Class가 양이 너무 커져서 기능에 대해서 찾기가 어려워졌기 때문에
    분류를 한단계 더 추가하게 되었다.

  2. Feature API 를 호출하면 메세지를 반환해준다.
    실제 장비에 들어가서 명령을 하지는 않는다.

메세지 = 장비.Main분류기능.Sub분류기능.함수명(필요한 데이터)

윈도우 환경에서도 API 사용 & SSH, Serial(direct) 지원 필요

  • pexpect를 이용해서 윈도우PC에서 장비로 telnet 접속이 안되어었다.
    telnet 세션 관련 라이브러리를 새로운걸로 변경이 필요했다.
  • SSH, Serial(dicect) 에 대해서 지원이 필요했다.
  • 어떤 라이브러리를 사용할지 조사를 통해서 결정하였고
    telnetlib, paramiko, pyserial 를 사용하기로 했다.

Connector(telnet/ssh/serial) 디자인 방법

  • Builder Pattern
  • Factory Pettern
  • Abstract Factory Pettern

  • 장비 명세서에 어떤_SESSION_COLLECTION 를 어떤걸 사용하겠다는 것을 명세 해준다.
  • 명세된 정보를 통해서 SESSION_COLLECTION_1 을 사용하게 될 것 이다.
  • Session (Telnet, SSH, Serial) 은 동일한 행위를 하는 API 로 만든다.
  • 필요한 시점에 원하는 정보로에 세션을 만들어 준다.
    • 인스턴스화한 장비에 telnet 으로 접속하고 싶다면, telnet 에 대한 정보를 입력해서 세션을 만든다.
    • 인스턴스화한 장비에 ssh 로 접속하고 싶다면, ssh 에 대한 정보를 입력해서 세션을 만든다.
    • 인스턴스화한 장비에 serial 로 접속하고 싶다면, serial 에 대한 정보를 입력해서 세션을 만든다.

명세서 예시)

어떤_SESSION_COLLECTION: SESSION_COLLECTION_1

pseudocode


Class Seesion(object):
    def 세션_만들기(self, 필요한_데이터_정보들):
        세션 = self._자식클래스의_세션만들기(**필요한_데이터_정보들)
        return 세션

    def 입력(self, 명령):
        self._자식클래스의_입력(명령)
        읽어온_정보 = self._자식클래스의_읽기 
        return 읽어온_정보
        
    def 로그인하기(self, 필요한_데이터_정보들):
        로그인_정보 = self._자식클래스의_로그인하기(**필요한_데이터_정보들)
    	return 로그인_정보
        

Class Telnet(Seesion):
    def _세션만들기(self):
         return telnetlib을 이용한 세션만들기
    
    def _입력(self):
        telnetlib을 이용한 입력
        
    def _읽기(self):
        return telnetlib을 이용한 읽기


Class SSH(Seesion):
    def _세션만들기(self):
         return paramiko을 이용한 세션만들기
    
    def _입력(self):
        paramiko을 이용한 입력
        
    def _읽기(self):
        return paramiko을 이용한 읽기
        
      
 Class Serial(Seesion):
    def _세션만들기(self):
         return pyserial을 이용한 세션만들기
    
    def _입력(self):
        pyserial을 이용한 입력
        
    def _읽기(self):
        return pyserial을 이용한 읽기
        
        
 Class TelnetClass1(Telnet):
     def _로그인하기(self, 필요한_데이터_정보들):
     	 # 특정 Vendor 마다 로그인 방법이 달랐다.
         return telnetlib을 이용해서 로그인하게 하기


 Class SSHClass1(SSH):
     def _로그인하기(self, 필요한_데이터_정보들):
     	 # 특정 Vendor 마다 로그인 방법이 달랐다.
         return paramiko을 이용해서 로그인하게 하기
         
         
 Class SerialClass1(Serial):
     def _로그인하기(self, 필요한_데이터_정보들):
     	 # 특정 Vendor 마다 로그인 방법이 달랐다.
         return pyserial을 이용해서 로그인하게 하기
         
 
SESSION_COLLECTION_MAP = {
    
    'SESSION_COLLECTION_1': {
    	'telnet': TelnetClass1,
        'ssh': SSHClass2,
        'serial': SerialClass2,
        
    },
    ...
}


TELNET_정보 = TELNET 만들기 위한 정보
SSH_정보 = SSH 만들기 위한 정보
SERIAL_정보 = Serial 만들기 위한 정보


장비.세션_만들기(TELNET_정보)
  # 세션만들기 안에 로직중에는
  # 선택된_SESSION_COLLECTION = 사용할_SESSION_선택하기(SESSION_COLLECTION_1, 사용할_SESSION은_Telnet_정보)


장비.세션[0].로그인하기()


장비.세션[0].입력('안녕하세요')
장비.세션[0].입력('你好!')
장비.세션[0].입력('Hello')

Feature API 를 이용해서 장비에 명령내리기


장비.세션_만들기(TELNET_정보)
장비.세션[0].로그인하기()

메세지들 = [
    장비.Main분류기능.Sub분류기능.함수1(필요한 데이터),
    장비.Main분류기능.Sub분류기능.함수2(필요한 데이터),
]


장비.세션[0].메세지_보내기(메세지들)

명령 입력 전/후 모드 이동 관련 (다음 포스팅에서...)

  • 이 부분에 대해서는 다음 포스팅에서 이야기를 다뤄보겠다.
profile
자동화 개발

0개의 댓글