agent/kickvmhandle/statushandle.go (114 lines of code) (raw):
package kickvmhandle
import (
"errors"
"github.com/aliyun/aliyun_assist_client/thirdparty/sirupsen/logrus"
"github.com/spf13/pflag"
"github.com/aliyun/aliyun_assist_client/agent/checknet"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/common/networkcategory"
)
type StatusHandle struct {
action string
params []string
}
var (
statusRoute map[string]handleFunc
ErrStatusNetworkInvalidParameters = errors.New("Invalid parameters for `kick_vm status network` action")
)
func init() {
statusRoute = map[string]handleFunc{
"network": requestNetworkStatus,
"collectNetConf": requestCollectNetConf,
}
}
func NewStatusHandle(action string, params []string) *StatusHandle {
return &StatusHandle{
action: action,
params: params,
}
}
func (h *StatusHandle) DoAction() error {
if v, ok := statusRoute[h.action]; ok {
return v(h.params)
} else {
return errors.New("no action found")
}
}
func (h *StatusHandle) CheckAction() bool {
if _, ok := statusRoute[h.action]; ok {
return true
} else {
return false
}
}
func requestNetworkStatus(params []string) error {
logger := log.GetLogger().WithFields(logrus.Fields{
"module": "requestNetworkStatus",
})
// REMEMBER: All actions in all kick_vm option handlers are not able to
// return results simultaneously.
logger.Info("params: ", params)
flags := pflag.NewFlagSet("network", pflag.ContinueOnError)
needToRefresh := flags.Bool("refresh", false, "Request to refresh the network diagnostic result")
isVPCNetwork := flags.Bool("vpc", false, "Declare the instance running in VPC network")
isClassicNetwork := flags.Bool("classic", false, "Declare the instance running in classic network")
// Disable unexpected usage printing when failing to parse kick_vm parameters
flags.Usage = func() {}
if err := flags.Parse(params); err != nil {
logger.WithFields(logrus.Fields{
"params": params,
}).WithError(err).Errorln("Failed to parse parameters of `kick_vm status network` action")
return ErrStatusNetworkInvalidParameters
}
// Behave as no-op when `--refresh` option is not specified
if *needToRefresh == false {
if *isVPCNetwork == true || *isClassicNetwork == true {
logger.WithFields(logrus.Fields{
"params": params,
}).Errorln("Network category options --vpc and --classic can only be specified when --refresh is specified at first")
return ErrStatusNetworkInvalidParameters
}
return nil
}
// Parse other options and request to refresh network diagnostic result
if *isVPCNetwork == true {
if *isClassicNetwork == true {
logger.WithFields(logrus.Fields{
"params": params,
}).Errorln("Network category options --vpc and --classic are contradictory")
return ErrStatusNetworkInvalidParameters
}
checknet.DeclareNetworkCategory(networkcategory.NetworkVPC)
} else if *isClassicNetwork == true {
if *isVPCNetwork == true {
logger.WithFields(logrus.Fields{
"params": params,
}).Errorln("Network category options --vpc and --classic are contradictory")
return ErrStatusNetworkInvalidParameters
}
checknet.DeclareNetworkCategory(networkcategory.NetworkClassic)
} else {
logger.WithFields(logrus.Fields{
"params": params,
}).Errorln("One of network category option --vpc or --classic must be specified")
return ErrStatusNetworkInvalidParameters
}
// Actions in kick_vm option handlers are all asynchronously called via new
// goroutine, thus synchronously calling checknet.RequestNetcheck() here is
// safe.
checknet.RequestNetcheck(checknet.NetcheckRequestForceOnce)
return nil
}
func requestCollectNetConf(params []string) error {
logger := log.GetLogger().WithFields(logrus.Fields{
"module": "requestCollectNetConf",
})
// REMEMBER: All actions in all kick_vm option handlers are not able to
// return results simultaneously.
flags := pflag.NewFlagSet("collectNetConf", pflag.ContinueOnError)
taskId := flags.String("taskId", "", "Set the taskId for the task of probing configurations of network")
// Disable unexpected usage printing when failing to parse kick_vm parameters
flags.Usage = func() {}
if err := flags.Parse(params); err != nil {
logger.WithFields(logrus.Fields{
"params": params,
}).WithError(err).Errorln("Failed to parse parameters of `kick_vm status collectNetConf` action")
return ErrStatusNetworkInvalidParameters
}
if len(*taskId) == 0 {
logger.Error("`taskId` missing")
return errors.New("param `taskId` missing")
}
exitCode, err := checknet.CollectNetworkConfiguration(logger, *taskId)
logger.Infof("exit code %d, err: %v", exitCode, err)
return nil
}