github.com/unirita/cuto@v0.9.8-0.20160830082821-aa6652f877b7/message/request.go (about)

     1  // Copyright 2015 unirita Inc.
     2  // Created 2015/04/10 honda
     3  
     4  package message
     5  
     6  import (
     7  	"encoding/json"
     8  	"fmt"
     9  )
    10  
    11  // リクエストメッセージ送信元masterのバージョン
    12  var MasterVersion string
    13  
    14  // 要求メッセージ。
    15  type Request struct {
    16  	Type      string `json:"type"`
    17  	Version   string `json:"version"`
    18  	NID       int    `json:"nid"`
    19  	JID       string `json:"jid"`
    20  	Path      string `json:"path"`
    21  	Param     string `json:"param"`
    22  	Env       string `json:"env"`
    23  	Workspace string `json:"workspace"`
    24  	WarnRC    int    `json:"warnrc"`
    25  	WarnStr   string `json:"warnstr"`
    26  	ErrRC     int    `json:"errrc"`
    27  	ErrStr    string `json:"errstr"`
    28  	Timeout   int    `json:"timeout"`
    29  }
    30  
    31  const requestMessageType = "request"
    32  const DockerTag = "<docker>"
    33  
    34  // ジョブ実行要求JSONメッセージをパースし、Requestオブジェクトのメンバをセットする。
    35  //
    36  // param : message 受信メッセージ文字列。
    37  func (r *Request) ParseJSON(message string) error {
    38  	byteMessage := []byte(message)
    39  
    40  	err := json.Unmarshal(byteMessage, r)
    41  
    42  	if err != nil {
    43  		return err
    44  	}
    45  
    46  	if r.Type != requestMessageType {
    47  		return fmt.Errorf("Invalid message type.")
    48  	}
    49  
    50  	return nil
    51  }
    52  
    53  // Requestオブジェクトの値を元に、ジョブ実行要求JSONメッセージを生成する
    54  //
    55  // return : JSONメッセージフォーマットの文字列。
    56  func (r Request) GenerateJSON() (string, error) {
    57  	r.Type = requestMessageType
    58  	r.Version = MasterVersion
    59  	byteMessage, err := json.Marshal(r)
    60  	if err != nil {
    61  		return ``, err
    62  	}
    63  
    64  	return string(byteMessage), nil
    65  }
    66  
    67  // masterで利用可能な変数を展開する。
    68  func (r *Request) ExpandMasterVars() error {
    69  	newPath, err := ExpandStringVars(r.Path, plcMaster, kndEnv)
    70  	if err != nil {
    71  		return err
    72  	}
    73  	newParam, err := ExpandStringVars(r.Param, plcMaster, kndSys, kndEnv, kndJob)
    74  	if err != nil {
    75  		return err
    76  	}
    77  	newEnv, err := ExpandStringVars(r.Env, plcMaster, kndSys, kndEnv, kndJob)
    78  	if err != nil {
    79  		return err
    80  	}
    81  	newWork, err := ExpandStringVars(r.Workspace, plcMaster, kndEnv)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	// 全て展開成功した場合のみメッセージの内容を書き換えする
    87  	r.Path = newPath
    88  	r.Param = newParam
    89  	r.Env = newEnv
    90  	r.Workspace = newWork
    91  	return nil
    92  }
    93  
    94  // servantで利用可能な変数を展開する。
    95  func (r *Request) ExpandServantVars() error {
    96  	newPath, err := ExpandStringVars(r.Path, plcServant, kndSys, kndEnv)
    97  	if err != nil {
    98  		return err
    99  	}
   100  	newParam, err := ExpandStringVars(r.Param, plcServant, kndSys, kndEnv, kndTime)
   101  	if err != nil {
   102  		return err
   103  	}
   104  	newEnv, err := ExpandStringVars(r.Env, plcServant, kndSys, kndEnv, kndTime)
   105  	if err != nil {
   106  		return err
   107  	}
   108  	newWork, err := ExpandStringVars(r.Workspace, plcServant, kndSys, kndEnv)
   109  	if err != nil {
   110  		return err
   111  	}
   112  
   113  	// 全て展開成功した場合のみメッセージの内容を書き換えする
   114  	r.Path = newPath
   115  	r.Param = newParam
   116  	r.Env = newEnv
   117  	r.Workspace = newWork
   118  	return nil
   119  }