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].메세지_보내기(메세지들)