ネットワークデバイス制御用抽象API-2


2019年1月9日
4人が協力して1年以上のプロジェクトが勃発した.💣
これと同じ2019年1月9日
新しいプロジェクトが作成されました.🏁
任務を受けた📩
同僚(2人)と2月1日まで📅
コアロジック実装と
20以上のFeature APIを実装
Prototypeを作成するプロセス.
そしてこうやってPrototypeを作るのを見て
2つ目の方法で行くか行かないかを決める.
第二の方法:注意事項🤔
  • の最初の失敗を経て、考慮事項が増えた.
  • 1)コード重複を減らしたい.
    1)デバイスコピーコードに従い、CLIは他の部分のみを置換する.△効率が悪い.
    初めての時に体験しました.デバイスのCLIは多様であり,拡張性を考慮する必要がある.
    2)経験不足の人が設定をうろうろしている.学習曲線を短縮したい.
    2)CLIが異なる場合,経験不足の人には,設定方法を試みることができる.
    3)コマンド入力前後モード移動問題
    3)第1の方法で有効なモード移動が必要
    4)デバイスのCommand機能とTelnetとの依存性の問題
    4)一度に「機能」(Feature)APIを呼び出す場合
    telnetセッションで、入力をデバイスに直ちに送信します.
    機能APIとセッション依存性の軽減
    5)SSH、シリアル(ダイレクト)を使用する必要がある(サポートするセッションタイプを増やす必要がある)
    5)セッションをtelnet、ssh、serialとして作成することによってデバイスを制御する.
    6)ウィンドウ環境でもAPIが必要
    6)pexpectでtelnetに接続するのは初めてです.
    pexpectを使用してWindows PCからtelnetデバイスに接続できません.
    2つ目の方法:抽象的な方法
    以下の方法を用いて抽象を設計した.
  • Builder Pattern
  • Abstract Factory Pettern
  • 設備リスト📄장비Aに明細を与える.장비Aは何らかの機能を持っています...
    設備リストのようです.작성한 명세서를 통해서 장비가 인스턴스화に達するようにします.
    リストの例)
    어떤_SESSION_COLLECTION: SESSION_COLLECTION_1
    분류_기능: MainFeatureClass
      기능1: 기능1SubFeatureClass1
      기능2: 기능2SubFeatureClass2
    ...
    例:Feature APIの使用方法

  • 一級分類が追加されました
    最初の方法のように近づくと、分類は1つしかないからです.
    クラスの数が大きすぎるので、機能を見つけるのは難しいです.
    分類が追加されました.

  • Feature APIを呼び出すとメッセージが返されます.
    実際の装備に入らずに号令する.
  • 메세지 = 장비.Main분류기능.Sub분류기능.함수명(필요한 데이터)
    ウィンドウ環境でもAPI&を使用するにはSSH、シリアルサポートが必要です
  • pexpectでWindows PCからtelnetに接続できません.
    telnetセッション関連ライブラリを新しいものに変更する必要があります.
  • SSH、シリアル(Dicect)のサポートが必要です.
  • 調査により、どのライブラリを使用するかが決定されます.
    telnetlib、paramiko、pyserialを使用することにしました.
  • Connector(telnet/ssh/serial)設計方法
  • Builder Pattern
  • Factory Pettern
  • Abstract Factory Pettern
  • 装備リストには、どのような어떤_SESSION_COLLECTIONを使用するかが書かれています.
  • はSESSION COLLECTION 1を使用します.
  • セッション(Telnet、SSH、Serial)は、同じ動作を持つAPIによって作成される.
  • 必要に応じてセッションを作成します.
  • のインスタンス化されたデバイスにtelnetを接続する場合は、telnetの情報を入力してセッションを作成します.
  • にインスタンス化されたデバイスにsshで接続する場合は、sshの情報を入力してセッションを作成します.
  • インスタンス化されたデバイスにシリアル接続したい場合は、シリアルに関する情報を入力してセッションを作成できます.
  • リストの例)
    어떤_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].메세지_보내기(메세지들)
    コマンド入力前後モード移動に関連(次の位置で...)
  • については、次の記事で議論します.