-
Notifications
You must be signed in to change notification settings - Fork 130
/
channelConfig.go
175 lines (158 loc) · 6.64 KB
/
channelConfig.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package operations
import (
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
"sync"
"time"
"github.com/davecgh/go-spew/spew"
"github.com/hyperledger/fabric-test/tools/operator/connectionprofile"
"github.com/hyperledger/fabric-test/tools/operator/logger"
"github.com/hyperledger/fabric-test/tools/operator/networkclient"
"github.com/hyperledger/fabric-test/tools/operator/paths"
"github.com/hyperledger/fabric-test/tools/operator/testclient/inputStructs"
)
//ChannelUIObject --
type ChannelUIObject struct {
TransType string `json:"transType,omitempty"`
TLS string `json:"TLS,omitempty"`
ChannelOpt ChannelOptions `json:"channelOpt,omitempty"`
ConnProfilePath string `json:"ConnProfilePath,omitempty"`
OrdererSystemChannel string `json:"ordererSystemChannel,omitempty"`
}
//ChannelOptions --
type ChannelOptions struct {
Name string `json:"name,omitempty"`
ChannelTX string `json:"channelTX,omitempty"`
Action string `json:"action,omitempty"`
OrgName []string `json:"orgName,omitempty"`
}
//ChannelConfigs -- To create channel objects based on create, join and anchorpeer and perform the channel configs and to update connection profile
func (c ChannelUIObject) ChannelConfigs(config inputStructs.Config, tls, action string) error {
var err error
var channelUIObjects, channelObjects []ChannelUIObject
var configObjects []inputStructs.Channel
var channelConfigObjects []interface{}
switch action {
case "create":
configObjects = config.CreateChannel
case "join":
configObjects = config.JoinChannel
case "anchorpeer":
configObjects = config.AnchorPeerUpdate
}
// print action (in bold) and input
fmt.Printf("\033[1m\nAction:%s\nInput:\033[0m\n%s\n", action, spew.Sdump(configObjects))
for i := 0; i < len(configObjects); i++ {
channelObjects = c.generateChannelUIObjects(configObjects[i], config.Organizations, tls, action, config.OrdererSystemChannel)
if len(channelObjects) > 0 {
channelUIObjects = append(channelUIObjects, channelObjects...)
}
channelConfigObjects = append(channelConfigObjects, &configObjects[i])
}
err = c.doChannelAction(channelUIObjects)
if err != nil {
return err
}
var connProfileObject connectionprofile.ConnProfile
err = connProfileObject.UpdateConnectionProfiles(channelConfigObjects, config.Organizations, action)
if err != nil {
return err
}
return nil
}
//generateChannelUIObjects -- To generate channel user input objects for all the channels
func (c ChannelUIObject) generateChannelUIObjects(channel inputStructs.Channel, organizations []inputStructs.Organization, tls, action, ordererChannel string) []ChannelUIObject {
var channelObjects []ChannelUIObject
if channel.ChannelPrefix != "" && channel.NumChannels > 0 {
channelObjects = c.createChannelObjectIfChanPrefix(channel, organizations, tls, action, ordererChannel)
return channelObjects
}
orgNames := strings.Split(channel.Organizations, ",")
channelObjects = c.createChannelConfigObjects(orgNames, channel.ChannelName, channel.ChannelTxPath, channel.AnchorPeerTxPath, tls, action, ordererChannel, organizations)
return channelObjects
}
//createChannelConfigObjects -- To create channel object per channel
func (c ChannelUIObject) createChannelConfigObjects(orgNames []string, channelName, channelTxPath, anchorPeerTxPath, tls, action, ordererChannel string, organizations []inputStructs.Organization) []ChannelUIObject {
var channelObjects []ChannelUIObject
var channelOpt ChannelOptions
if action != "join" && len(orgNames) > 1 {
orgNames = []string{orgNames[0]}
}
for _, orgName := range orgNames {
orgName = strings.TrimSpace(orgName)
if action == "anchorpeer" {
action = "update"
channelTxPath = anchorPeerTxPath
}
channelOpt = ChannelOptions{
Name: channelName,
Action: action,
OrgName: []string{orgName},
ChannelTX: channelTxPath,
}
c = ChannelUIObject{
TransType: "Channel",
TLS: tls,
ConnProfilePath: paths.GetConnProfilePath([]string{orgName}, organizations),
ChannelOpt: channelOpt,
OrdererSystemChannel: ordererChannel,
}
channelObjects = append(channelObjects, c)
}
return channelObjects
}
//createChannelObjectIfChanPrefix -- To create channel objects of channel prefix and number of channels is given
func (c ChannelUIObject) createChannelObjectIfChanPrefix(channel inputStructs.Channel, organizations []inputStructs.Organization, tls, action, ordererChannel string) []ChannelUIObject {
var channelUIObjects []ChannelUIObject
var channelTxPath, anchopPeerTxPath, channelName string
if action != "anchorpeer" {
for j := 0; j < channel.NumChannels; j++ {
channelName = fmt.Sprintf("%s%s", channel.ChannelPrefix, strconv.Itoa(j))
channelTxPath = paths.JoinPath(channel.ChannelTxPath, fmt.Sprintf("%s.tx", channelName))
orgNames := strings.Split(channel.Organizations, ",")
channelobjects := c.createChannelConfigObjects(orgNames, channelName, channelTxPath, anchopPeerTxPath, tls, action, ordererChannel, organizations)
channelUIObjects = append(channelUIObjects, channelobjects...)
}
return channelUIObjects
}
for j := 0; j < channel.NumChannels; j++ {
channelName = fmt.Sprintf("%s%s", channel.ChannelPrefix, strconv.Itoa(j))
anchopPeerTxPath = paths.JoinPath(channel.AnchorPeerTxPath, fmt.Sprintf("%s%sanchor.tx", channelName, channel.Organizations))
orgNames := strings.Split(channel.Organizations, ",")
anchorPeerObjects := c.createChannelConfigObjects(orgNames, channelName, channelTxPath, anchopPeerTxPath, tls, action, ordererChannel, organizations)
channelUIObjects = append(channelUIObjects, anchorPeerObjects...)
}
return channelUIObjects
}
func (c ChannelUIObject) channelConfig(action, channelName string, args []string, wg *sync.WaitGroup) error {
defer wg.Done()
_, err := networkclient.ExecuteCommand("node", args, true)
if err != nil {
logger.ERROR(fmt.Sprintf("Failed to perform %s action on %s channel: %v", action, channelName, err))
os.Exit(1)
}
return nil
}
//doChannelAction -- To perform channel operations including create, anchorpeer update and join channel
func (c ChannelUIObject) doChannelAction(channelUIObjects []ChannelUIObject) error {
var err error
var jsonObject []byte
var wg sync.WaitGroup
pteMainPath := paths.PTEPath()
var args []string
for i, channelObject := range channelUIObjects {
jsonObject, err = json.Marshal(channelObject)
if err != nil {
return err
}
startTime := time.Now().String()
args = []string{pteMainPath, strconv.Itoa(i), string(jsonObject), startTime}
wg.Add(1)
go c.channelConfig(channelObject.ChannelOpt.Action, channelObject.ChannelOpt.Name, args, &wg)
}
wg.Wait()
return nil
}