2019년 1월 9일
4명이서 1년 넘게 작업한 프로젝트를 폭발시켰다. 💣
그와 동일한 2019년 1월 9일
새로운 프로젝트를 만들었다. 🏁
미션을 받게 되었다. 📩
동료 한분과(총 2명) 2월 1일까지 📅
Core 로직 구현과
20여개 정도의 Feature API 구현
Prototype 의 절차를 만들어라.
그리고 이렇게 Prototype 으로 만들어진 것을 보고
2차 방법으로 갈지/말지에 대해서 선택하는 시간을 갖기로 하였다.
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 접속이 안되어었다.
아래와 같은 접근 방법으로 추상화를 디자인을 했었다.
장비A
에 대해서 명세를 해준다.
장비A
는 어떤 기능을 가지고 있고 ...
마치 장비에 대한 명세서라는 것을 작성하여
작성한 명세서를 통해서 장비가 인스턴스화
될 수 있도록 하게 하였다.
어떤_SESSION_COLLECTION: SESSION_COLLECTION_1
분류_기능: MainFeatureClass
기능1: 기능1SubFeatureClass1
기능2: 기능2SubFeatureClass2
...
분류를 한단계 더 추가하였다.
1차 방법처럼 접근한다면 분류가 1개만 있으니깐
Class가 양이 너무 커져서 기능에 대해서 찾기가 어려워졌기 때문에
분류를 한단계 더 추가하게 되었다.
Feature API 를 호출하면 메세지를 반환해준다.
실제 장비에 들어가서 명령을 하지는 않는다.
메세지 = 장비.Main분류기능.Sub분류기능.함수명(필요한 데이터)
어떤_SESSION_COLLECTION
를 어떤걸 사용하겠다는 것을 명세 해준다.어떤_SESSION_COLLECTION: SESSION_COLLECTION_1
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')
장비.세션_만들기(TELNET_정보)
장비.세션[0].로그인하기()
메세지들 = [
장비.Main분류기능.Sub분류기능.함수1(필요한 데이터),
장비.Main분류기능.Sub분류기능.함수2(필요한 데이터),
]
장비.세션[0].메세지_보내기(메세지들)