/
machine.go
81 lines (65 loc) · 1.86 KB
/
machine.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright 2019 Shanghai JingDuo Information Technology co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package machine
import (
"fmt"
"io"
pb "github.com/kpaas-io/kpaas/pkg/deploy/protos"
)
type IMachine interface {
GetName() string
GetIp() string
GetNode() *pb.Node
Close()
Run(cmd string) (stdout, stderr []byte, err error)
FetchDir(localDir, remoteDir string, fileNeeded func(path string) bool) error
FetchFile(dst io.Writer, remotePath string) error
FetchFileToLocalPath(localPath, remotePath string) error
PutDir(localDir, remoteDir string, fileNeeded func(path string) bool) error
PutFile(content io.Reader, remotePath string) error
}
type Machine struct {
*ExecClient
*pb.Node
}
func NewMachine(node *pb.Node) (IMachine, error) {
if IsTesting {
return newMockMachine(node)
}
return newMachine(node)
}
func newMachine(node *pb.Node) (IMachine, error) {
client, err := NewExecClient(node)
if err != nil {
return nil, fmt.Errorf("failed to create execution client for machine: %v(%v), error: %v", node.Name, node.Ip, err)
}
return &Machine{
ExecClient: client,
Node: node,
}, nil
}
func (m *Machine) Close() {
if m.ExecClient != nil {
m.ExecClient.Close()
}
}
func (m *Machine) GetName() string {
return m.Name
}
func (m *Machine) GetIp() string {
return m.Ip
}
func (m *Machine) GetNode() *pb.Node {
return m.Node
}