dewiring 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/bin/wire +7 -0
- data/bin/wire-network-container.sh +547 -0
- data/lib/test_fig.rb +46 -0
- data/lib/wire/cli/cli_commands.rb +88 -0
- data/lib/wire/cli/main_cli.rb +129 -0
- data/lib/wire/cli.rb +8 -0
- data/lib/wire/commands/base_command.rb +139 -0
- data/lib/wire/commands/down_command.rb +69 -0
- data/lib/wire/commands/down_command_handler.rb +199 -0
- data/lib/wire/commands/init_command.rb +89 -0
- data/lib/wire/commands/init_interactive.rb +75 -0
- data/lib/wire/commands/spec_command.rb +240 -0
- data/lib/wire/commands/spec_templates.rb +134 -0
- data/lib/wire/commands/up_command.rb +69 -0
- data/lib/wire/commands/up_command_handler.rb +193 -0
- data/lib/wire/commands/updown_command_base.rb +80 -0
- data/lib/wire/commands/validate_command.rb +64 -0
- data/lib/wire/commands/verify_command.rb +196 -0
- data/lib/wire/commands/verify_command_handler.rb +134 -0
- data/lib/wire/commands.rb +19 -0
- data/lib/wire/common.rb +42 -0
- data/lib/wire/execution/local_exec.rb +110 -0
- data/lib/wire/execution.rb +7 -0
- data/lib/wire/model/appgroup_validation.rb +45 -0
- data/lib/wire/model/loader.rb +49 -0
- data/lib/wire/model/network_validation.rb +111 -0
- data/lib/wire/model/project.rb +64 -0
- data/lib/wire/model/state.rb +154 -0
- data/lib/wire/model/validation.rb +66 -0
- data/lib/wire/model/verification.rb +37 -0
- data/lib/wire/model.rb +13 -0
- data/lib/wire/resource/bridge.rb +76 -0
- data/lib/wire/resource/dhcp_range_config.rb +135 -0
- data/lib/wire/resource/fig_adapter.rb +127 -0
- data/lib/wire/resource/ip_binary.rb +141 -0
- data/lib/wire/resource/ipaddr_ext.rb +38 -0
- data/lib/wire/resource/ipaddr_on_intf.rb +108 -0
- data/lib/wire/resource/network_injection.rb +138 -0
- data/lib/wire/resource/resource.rb +52 -0
- data/lib/wire/resource.rb +14 -0
- data/lib/wire/version.rb +14 -0
- data/lib/wire.rb +24 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NzU2MDIzZWQ2ZjM5OTgxMmNhMjkwYTU3YjE2M2RiMTRhM2JjMmU3Zg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTZmZWM4NDZiMTU5ZWRkOTkzZjk0YTJjNjQ4MmFhNWQ5N2VkMjUwNA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
M2NjMjBhOTgwYjAzMDY2MTA2YTM4OTNmNDM4NGI0OTk2MDdhM2Q0NGJiNmJi
|
10
|
+
MTcwYzE3ZjllODQ5NWQwZTZiNzU3OTA4Yzg3NWY1YWU5MmZhZTdiNmU5ZWI0
|
11
|
+
N2YxNDM5YTdjODgxZTEwN2IwOGNmZWQ4MThjNjUyNzQyYzY0YjM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OWY1NTc0Yzg5NTEwYTVmZGUxNjkzZTczYjQ5ZDk3NzUzYzg2OGM0ZjdlN2Q5
|
14
|
+
M2Y1YjBmMmM4NTA4YjgwOWVmZGE2YmQ2MjI4NWUzNDM3NTc1NjNmNzg3ZWE0
|
15
|
+
YzJlMTdhMTM3YTg4MGM4ZmU3ZjY1ODZjMTk2ZDc1ZGYwMmQzODc=
|
data/bin/wire
ADDED
@@ -0,0 +1,547 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
#
|
3
|
+
# attach-container.sh
|
4
|
+
# MIT License
|
5
|
+
#
|
6
|
+
# attaches multiple containers to multiple ovs bridges
|
7
|
+
#
|
8
|
+
|
9
|
+
# Display usage and help
|
10
|
+
function usage() {
|
11
|
+
echo 'attach-container.sh <COMMAND> [OPTIONS] -- <device:bridge> [<device:bridge>] <container-id> [<container-id>]'
|
12
|
+
echo ' where COMMAND is one of'
|
13
|
+
echo ' verify verify given container/device/bridge options'
|
14
|
+
echo ' attach attach devices to bridges and containers'
|
15
|
+
echo ' detach detach devices from bridges and containers'
|
16
|
+
echo ' where OPTIONS are'
|
17
|
+
echo ' -n/--noop only print commands, do not change'
|
18
|
+
echo ' -d/--debug show debug output'
|
19
|
+
echo ' Examples:'
|
20
|
+
echo ' attach-containers.sh attach -- eth1:br1 eth2:br2 02978729 12673482'
|
21
|
+
echo ' attach-containers.sh verify -- eth1:br1 eth2:br2 02978729 12673482'
|
22
|
+
echo ' attach-containers.sh detach -- eth1:br1 eth2:br2 02978729 12673482'
|
23
|
+
}
|
24
|
+
|
25
|
+
|
26
|
+
# -- FUNCTION ----------------------------------------------------------------
|
27
|
+
# Name: split_args
|
28
|
+
# Description: Splits up args after -- and puts them in DEVICE_ARR/ID_ARR arrays
|
29
|
+
# ----------------------------------------------------------------------------
|
30
|
+
function split_args() {
|
31
|
+
for ARG in $@; do
|
32
|
+
if [[ "$ARG" =~ .*:.* ]] ; then
|
33
|
+
DEVICE_ARR="$DEVICE_ARR $ARG"
|
34
|
+
else
|
35
|
+
ID_ARR="$ID_ARR $ARG"
|
36
|
+
fi
|
37
|
+
done
|
38
|
+
}
|
39
|
+
|
40
|
+
# DEBUG and dummy output
|
41
|
+
function nodebug() {
|
42
|
+
echo $* >/dev/null
|
43
|
+
}
|
44
|
+
function debug() {
|
45
|
+
[[ "$QUIET" != "1" ]] && echo DEBUG $*
|
46
|
+
}
|
47
|
+
function log_error() {
|
48
|
+
echo ERROR $* >&2
|
49
|
+
}
|
50
|
+
function log_ok() {
|
51
|
+
[[ "$QUIET" != "1" ]] && echo OK $*
|
52
|
+
}
|
53
|
+
|
54
|
+
NOOP=
|
55
|
+
MODE=
|
56
|
+
ACTION=
|
57
|
+
DEBUG=nodebug
|
58
|
+
|
59
|
+
while :
|
60
|
+
do
|
61
|
+
case "$1" in
|
62
|
+
verify | attach | detach)
|
63
|
+
ACTION=$1
|
64
|
+
shift
|
65
|
+
;;
|
66
|
+
-h | --help)
|
67
|
+
usage
|
68
|
+
exit 0
|
69
|
+
;;
|
70
|
+
-n | --noop)
|
71
|
+
NOOP=1
|
72
|
+
shift
|
73
|
+
;;
|
74
|
+
-d | --debug)
|
75
|
+
DEBUG=debug
|
76
|
+
shift
|
77
|
+
;;
|
78
|
+
--) # End of all options
|
79
|
+
shift
|
80
|
+
break
|
81
|
+
;;
|
82
|
+
-*)
|
83
|
+
echo "Error: Unknown option: $1" >&2
|
84
|
+
exit 1
|
85
|
+
;;
|
86
|
+
*) # No more options
|
87
|
+
break
|
88
|
+
;;
|
89
|
+
esac
|
90
|
+
done
|
91
|
+
|
92
|
+
# Check mandatory input arguments
|
93
|
+
if [[ -z "$ACTION" ]]; then
|
94
|
+
log_error No action given, see usage
|
95
|
+
usage
|
96
|
+
exit 1
|
97
|
+
fi
|
98
|
+
|
99
|
+
split_args $@
|
100
|
+
|
101
|
+
if [[ -z "$DEVICE_ARR" ]]; then
|
102
|
+
log_error No device/bridge part specified.
|
103
|
+
usage
|
104
|
+
exit 2
|
105
|
+
fi
|
106
|
+
if [[ -z "$ID_ARR" ]]; then
|
107
|
+
log_error No container ids specified.
|
108
|
+
usage
|
109
|
+
exit 3
|
110
|
+
fi
|
111
|
+
|
112
|
+
[[ "$NOOP" -eq 1 ]] && MODE='echo NOOP% '
|
113
|
+
|
114
|
+
# DEBUG
|
115
|
+
PS4='+|${BASH_SOURCE##*/} ${LINENO}${FUNCNAME[0]:+ ${FUNCNAME[0]}}| '
|
116
|
+
|
117
|
+
# locate binaries
|
118
|
+
# TODO: add defaults
|
119
|
+
IP=$(which ip)
|
120
|
+
OVS_VSCTL=$(which ovs-vsctl)
|
121
|
+
DOCKER=$(which docker)
|
122
|
+
|
123
|
+
# -- FUNCTION ----------------------------------------------------------------
|
124
|
+
# Name: container_process
|
125
|
+
# Description: Given ID of container, this returns the Process id
|
126
|
+
# Parameters
|
127
|
+
# 1: Docker Container ID
|
128
|
+
# Returns : Container Process ID
|
129
|
+
# ----------------------------------------------------------------------------
|
130
|
+
function container_process() {
|
131
|
+
T="$1"
|
132
|
+
local PID=$(sudo docker inspect -f '{{ .State.Pid }}' "$T")
|
133
|
+
|
134
|
+
echo $PID
|
135
|
+
}
|
136
|
+
|
137
|
+
# -- FUNCTION ----------------------------------------------------------------
|
138
|
+
# Name: link_netns
|
139
|
+
# Description: Puts link in /var/run/netns according to given process id
|
140
|
+
# Parameters
|
141
|
+
# 1: Container Process ID
|
142
|
+
# ----------------------------------------------------------------------------
|
143
|
+
function link_netns() {
|
144
|
+
$MODE sudo mkdir -p /var/run/netns
|
145
|
+
local PID="$1"
|
146
|
+
$MODE sudo ln -s /proc/$PID/ns/net /var/run/netns/$PID
|
147
|
+
}
|
148
|
+
|
149
|
+
# -- FUNCTION ----------------------------------------------------------------
|
150
|
+
# Name: unlink_netns
|
151
|
+
# Description: removes link from /var/run/netns
|
152
|
+
# Parameters
|
153
|
+
# 1: Container Process ID
|
154
|
+
# ----------------------------------------------------------------------------
|
155
|
+
function unlink_netns() {
|
156
|
+
local PID=$1
|
157
|
+
$MODE sudo rm /var/run/netns/$PID
|
158
|
+
}
|
159
|
+
|
160
|
+
# -- FUNCTION ----------------------------------------------------------------
|
161
|
+
# Name: get_mtu
|
162
|
+
# Description: Retrieves the MTU for a given device
|
163
|
+
# Parameters
|
164
|
+
# 1: Device
|
165
|
+
# Returns : MTU
|
166
|
+
# ----------------------------------------------------------------------------
|
167
|
+
function get_mtu() {
|
168
|
+
local DEV=$1
|
169
|
+
local MTU=$(ip link show $DEV | grep mtu | sed -e 's/.*mtu \([0-9]*\) .*/\1/')
|
170
|
+
|
171
|
+
echo $MTU
|
172
|
+
}
|
173
|
+
|
174
|
+
# -- FUNCTION ----------------------------------------------------------------
|
175
|
+
# Name: add_peer_interfaces
|
176
|
+
# Description: creates the host/container peer interfaces
|
177
|
+
# Parameters
|
178
|
+
# 1: Host interface name
|
179
|
+
# 2: Container Interface name
|
180
|
+
# 3: mtu on bridge
|
181
|
+
# ----------------------------------------------------------------------------
|
182
|
+
function add_peer_interfaces() {
|
183
|
+
local HOST_IF=$1
|
184
|
+
local CONTAINER_IF=$2
|
185
|
+
local MTU=$3
|
186
|
+
$MODE sudo $IP link add name $HOST_IF mtu $MTU type veth peer name $CONTAINER_IF mtu $MTU
|
187
|
+
return $?
|
188
|
+
}
|
189
|
+
|
190
|
+
# -- FUNCTION ----------------------------------------------------------------
|
191
|
+
# Name: add_device_to_switch
|
192
|
+
# Description: Adds an interface device to given ovs bridge
|
193
|
+
# Parameters
|
194
|
+
# 1: interface name
|
195
|
+
# 2: ovs bridge name
|
196
|
+
# ----------------------------------------------------------------------------
|
197
|
+
function add_device_to_switch() {
|
198
|
+
local HOST_IF=$1
|
199
|
+
local SWITCH=$2
|
200
|
+
$MODE sudo $OVS_VSCTL add-port $SWITCH $HOST_IF
|
201
|
+
return $?
|
202
|
+
}
|
203
|
+
|
204
|
+
# -- FUNCTION ----------------------------------------------------------------
|
205
|
+
# Name: remove_device_from_switch
|
206
|
+
# Description: Removes an interface device from given ovs bridge
|
207
|
+
# Parameters
|
208
|
+
# 1: interface name
|
209
|
+
# 2: ovs bridge name
|
210
|
+
# ----------------------------------------------------------------------------
|
211
|
+
function remove_device_from_switch() {
|
212
|
+
local HOST_IF=$1
|
213
|
+
local SWITCH=$2
|
214
|
+
$MODE sudo $OVS_VSCTL del-port $SWITCH $HOST_IF
|
215
|
+
return $?
|
216
|
+
}
|
217
|
+
|
218
|
+
# -- FUNCTION ----------------------------------------------------------------
|
219
|
+
# Name: configure_interfaces
|
220
|
+
# Description: brings container interfaces up, sets namespace and names
|
221
|
+
# see: https://docs.docker.com/articles/networking/#how-docker-networks-a-container
|
222
|
+
# Parameters
|
223
|
+
# 1: Host interface name
|
224
|
+
# 2: Container Interface name (peer)
|
225
|
+
# 3: Namespace (=container pid)
|
226
|
+
# 4: container device name
|
227
|
+
# ----------------------------------------------------------------------------
|
228
|
+
function configure_interfaces() {
|
229
|
+
local HOST_IF=$1
|
230
|
+
local CONTAINER_IF=$2
|
231
|
+
local NS=$3
|
232
|
+
local DEVICE=$4
|
233
|
+
$MODE sudo $IP link set $HOST_IF up && \
|
234
|
+
$MODE sudo $IP link set $CONTAINER_IF netns $NS && \
|
235
|
+
$MODE sudo $IP netns exec $NS ip link set $CONTAINER_IF name $DEVICE
|
236
|
+
return $?
|
237
|
+
}
|
238
|
+
|
239
|
+
# -- FUNCTION ----------------------------------------------------------------
|
240
|
+
# Name: delete_interfaces
|
241
|
+
# Description: deletes the interface pair on host
|
242
|
+
# Parameters
|
243
|
+
# 1: Host interface name
|
244
|
+
# 2: Container Interface name (peer)
|
245
|
+
# 3: Namespace (=container pid)
|
246
|
+
# 4: container device name
|
247
|
+
# Returns : exit code of ip link delete command
|
248
|
+
# ----------------------------------------------------------------------------
|
249
|
+
function delete_interfaces() {
|
250
|
+
local HOST_IF=$1
|
251
|
+
local CONTAINER_IF=$2
|
252
|
+
local NS=$3
|
253
|
+
local DEVICE=$4
|
254
|
+
$MODE sudo $IP link delete $HOST_IF type veth peer name $CONTAINER_IF
|
255
|
+
return $?
|
256
|
+
}
|
257
|
+
|
258
|
+
# -- FUNCTION ----------------------------------------------------------------
|
259
|
+
# Name: has_interfaces
|
260
|
+
# Description: checks if container/host is set up correctly
|
261
|
+
# Parameters
|
262
|
+
# 1: Host interface name
|
263
|
+
# 2: Container Interface name (peer)
|
264
|
+
# 3: Namespace (=container pid)
|
265
|
+
# 4: container device name
|
266
|
+
# Returns : 0=ok, 1=failed
|
267
|
+
# ----------------------------------------------------------------------------
|
268
|
+
function has_interfaces() {
|
269
|
+
local HOST_IF=$1
|
270
|
+
local CONTAINER_IF=$2
|
271
|
+
local NS=$3
|
272
|
+
local DEVICE=$4
|
273
|
+
|
274
|
+
# container device
|
275
|
+
$MODE sudo $IP netns exec $NS $IP link show $DEVICE >/dev/null 2>&1
|
276
|
+
if [[ $? -ne 0 ]]; then
|
277
|
+
return 1
|
278
|
+
fi
|
279
|
+
# check if we have an ip
|
280
|
+
$MODE sudo $IP netns exec $NS $IP addr show $DEVICE 2>&1 | grep 'inet ' >/dev/null 2>&1
|
281
|
+
if [[ $? -ne 0 ]]; then
|
282
|
+
return 1
|
283
|
+
fi
|
284
|
+
|
285
|
+
# host devices
|
286
|
+
$MODE sudo $IP link show $HOST_IF >/dev/null 2>&1
|
287
|
+
if [[ $? -ne 0 ]]; then
|
288
|
+
return 1
|
289
|
+
fi
|
290
|
+
|
291
|
+
# TODO: CHeck container interface
|
292
|
+
|
293
|
+
return 0
|
294
|
+
}
|
295
|
+
|
296
|
+
# -- FUNCTION ----------------------------------------------------------------
|
297
|
+
# Name: dhcp_container
|
298
|
+
# Description: calls dhclient for interface of namespace
|
299
|
+
# Parameters
|
300
|
+
# 1: Namespace (=container pid)
|
301
|
+
# 2: container device name
|
302
|
+
# Returns : 0=ok, 1=failed
|
303
|
+
# ----------------------------------------------------------------------------
|
304
|
+
function dhcp_container() {
|
305
|
+
local NS=$1
|
306
|
+
local DEVICE=$2
|
307
|
+
$MODE sudo $IP netns exec $NS dhclient -v -1 $DEVICE
|
308
|
+
return $?
|
309
|
+
}
|
310
|
+
|
311
|
+
# == AGGREGATE FUNCTIONS =====================================================
|
312
|
+
|
313
|
+
# -- FUNCTION ----------------------------------------------------------------
|
314
|
+
# Name: handle_verify
|
315
|
+
# Checks if
|
316
|
+
# - container ids are valid
|
317
|
+
# - pids can be queried
|
318
|
+
# - bridges exist and are up
|
319
|
+
# - container device names not yet in use
|
320
|
+
# Returns : 0=ok, 1=failed
|
321
|
+
# ----------------------------------------------------------------------------
|
322
|
+
function handle_verify() {
|
323
|
+
local RES=0
|
324
|
+
|
325
|
+
# ensure there are containers running before continuing
|
326
|
+
CURRENT_IDS=$(sudo $DOCKER ps -q --no-trunc)
|
327
|
+
if [[ -z "$CURRENT_IDS" ]]; then
|
328
|
+
log_error No running containers found.
|
329
|
+
exit 10
|
330
|
+
fi
|
331
|
+
|
332
|
+
for DEVICE_PAIR in $DEVICE_ARR; do
|
333
|
+
BRIDGE=$(echo $DEVICE_PAIR | awk -F':' '{ print $2 }' )
|
334
|
+
$DEBUG Checking $BRIDGE
|
335
|
+
sudo $OVS_VSCTL br-exists $BRIDGE
|
336
|
+
if [[ $? -eq 0 ]]; then
|
337
|
+
log_ok $BRIDGE
|
338
|
+
else
|
339
|
+
log_error Unable to find ovs bridge $BRIDGE
|
340
|
+
RES=1
|
341
|
+
fi
|
342
|
+
done
|
343
|
+
|
344
|
+
# iterate given container ids
|
345
|
+
for ID in $ID_ARR; do
|
346
|
+
$DEBUG Checking $ID
|
347
|
+
if [[ ! $CURRENT_IDS =~ $ID ]]; then
|
348
|
+
log_error No container for $ID found, skipping...
|
349
|
+
RES=1
|
350
|
+
else
|
351
|
+
# get pid
|
352
|
+
PID=$(container_process $ID)
|
353
|
+
if [[ -z $PID ]]; then
|
354
|
+
log_error Unable to grab PID for $ID, skipping
|
355
|
+
RES=1
|
356
|
+
else
|
357
|
+
log_ok $ID
|
358
|
+
|
359
|
+
# with pid, check given devices
|
360
|
+
# on host and in container
|
361
|
+
|
362
|
+
$DEBUG - Checking devices in $ID
|
363
|
+
link_netns "${PID}"
|
364
|
+
|
365
|
+
# iterate given devices
|
366
|
+
for DEVICE_PAIR in $DEVICE_ARR; do
|
367
|
+
INTF=$(echo "$DEVICE_PAIR" | awk -F':' '{ print $1 }' )
|
368
|
+
$DEBUG -- Checking $INTF
|
369
|
+
HOST_IFNAME=v${INTF}h${PID}
|
370
|
+
CONTAINER_IFNAME=v${INTF}c${PID}
|
371
|
+
|
372
|
+
has_interfaces $HOST_IFNAME $CONTAINER_IFNAME $PID $INTF
|
373
|
+
if [[ $? -eq 0 ]]; then
|
374
|
+
log_ok "$ID"/"$PID" has a "$CONTAINER_IFNAME", host has a "$HOST_IFNAME"
|
375
|
+
else
|
376
|
+
log_error "$ID"/"$PID" does not have correct devices
|
377
|
+
RES=1
|
378
|
+
fi
|
379
|
+
done
|
380
|
+
|
381
|
+
unlink_netns "${PID}"
|
382
|
+
fi
|
383
|
+
fi
|
384
|
+
done
|
385
|
+
|
386
|
+
return $RES
|
387
|
+
}
|
388
|
+
|
389
|
+
# -- FUNCTION ----------------------------------------------------------------
|
390
|
+
# Name: handle_attach
|
391
|
+
# Description: attaches all containers (of $ID_ARR) to all bridges ($DEVICE_ADDR)
|
392
|
+
# with its local interface names. Calls dhclient for all interfaces.
|
393
|
+
# Returns : 0=ok, 1=failed
|
394
|
+
# ----------------------------------------------------------------------------
|
395
|
+
function handle_attach() {
|
396
|
+
local RES=0
|
397
|
+
|
398
|
+
# iterate given container ids
|
399
|
+
for TARGET in $ID_ARR; do
|
400
|
+
$DEBUG Attaching $TARGET
|
401
|
+
|
402
|
+
TARGET_PID=$(container_process $TARGET)
|
403
|
+
$DEBUG PID of $TARGET is $TARGET_PID
|
404
|
+
|
405
|
+
link_netns ${TARGET_PID}
|
406
|
+
|
407
|
+
# iterate given devices
|
408
|
+
for DEVICE_PAIR in $DEVICE_ARR; do
|
409
|
+
INTF=$(echo $DEVICE_PAIR | awk -F':' '{ print $1 }' )
|
410
|
+
BRIDGE=$(echo $DEVICE_PAIR | awk -F':' '{ print $2 }' )
|
411
|
+
$DEBUG Attaching $INTF to $BRIDGE
|
412
|
+
|
413
|
+
BRIDGEDEV_MTU=$(get_mtu $BRIDGE)
|
414
|
+
if [[ -z "$BRIDGEDEV_MTU" ]]; then
|
415
|
+
log_error querying mtu of $BRIDGE, aborting
|
416
|
+
RES=1
|
417
|
+
break
|
418
|
+
fi
|
419
|
+
|
420
|
+
HOST_IFNAME=v${INTF}h${TARGET_PID}
|
421
|
+
CONTAINER_IFNAME=v${INTF}c${TARGET_PID}
|
422
|
+
$DEBUG - interface pair names are ${HOST_IFNAME}/${CONTAINER_IFNAME}
|
423
|
+
|
424
|
+
$DEBUG - creating peer interfaces
|
425
|
+
add_peer_interfaces $HOST_IFNAME $CONTAINER_IFNAME $BRIDGEDEV_MTU
|
426
|
+
if [[ $? -ne 0 ]]; then
|
427
|
+
log_error creating peer interfaces. aborting
|
428
|
+
RES=1
|
429
|
+
continue
|
430
|
+
fi
|
431
|
+
|
432
|
+
$DEBUG - adding $HOST_IFNAME to $BRIDGE
|
433
|
+
add_device_to_switch $HOST_IFNAME $BRIDGE
|
434
|
+
if [[ $? -ne 0 ]]; then
|
435
|
+
log_error adding device to bridge. aborting
|
436
|
+
RES=1
|
437
|
+
continue
|
438
|
+
fi
|
439
|
+
|
440
|
+
$DEBUG - configuring interfaces
|
441
|
+
configure_interfaces $HOST_IFNAME $CONTAINER_IFNAME $TARGET_PID $INTF
|
442
|
+
if [[ $? -ne 0 ]]; then
|
443
|
+
log_error configuring interfaces. aborting
|
444
|
+
RES=1
|
445
|
+
continue
|
446
|
+
fi
|
447
|
+
|
448
|
+
$DEBUG - dhcp requesting address
|
449
|
+
dhcp_container $TARGET_PID $INTF
|
450
|
+
if [[ $? -ne 0 ]]; then
|
451
|
+
log_error running dhcp. aborting
|
452
|
+
RES=1
|
453
|
+
continue
|
454
|
+
fi
|
455
|
+
done
|
456
|
+
|
457
|
+
unlink_netns $TARGET_PID
|
458
|
+
done
|
459
|
+
|
460
|
+
return $RES
|
461
|
+
}
|
462
|
+
|
463
|
+
# -- FUNCTION ----------------------------------------------------------------
|
464
|
+
# Name: handle_detach
|
465
|
+
# Description: detaches all containers (of $ID_ARR) from all bridges ($DEVICE_ADDR)
|
466
|
+
# Removes eth/veth pairs from host
|
467
|
+
# Returns : 0=ok, 1=failed
|
468
|
+
# ----------------------------------------------------------------------------
|
469
|
+
function handle_detach() {
|
470
|
+
local RES=0
|
471
|
+
|
472
|
+
# iterate given container ids
|
473
|
+
for TARGET in $ID_ARR; do
|
474
|
+
$DEBUG Detaching $TARGET
|
475
|
+
|
476
|
+
TARGET_PID=$(container_process $TARGET)
|
477
|
+
$DEBUG PID of $TARGET is $TARGET_PID
|
478
|
+
|
479
|
+
link_netns ${TARGET_PID}
|
480
|
+
|
481
|
+
# iterate given devices
|
482
|
+
for DEVICE_PAIR in $DEVICE_ARR; do
|
483
|
+
INTF=$(echo $DEVICE_PAIR | awk -F':' '{ print $1 }' )
|
484
|
+
BRIDGE=$(echo $DEVICE_PAIR | awk -F':' '{ print $2 }' )
|
485
|
+
|
486
|
+
HOST_IFNAME=v${INTF}h${TARGET_PID}
|
487
|
+
CONTAINER_IFNAME=v${INTF}c${TARGET_PID}
|
488
|
+
$DEBUG - interface pair names are ${HOST_IFNAME}/${CONTAINER_IFNAME}
|
489
|
+
|
490
|
+
$DEBUG - removing $HOST_IFNAME from $BRIDGE
|
491
|
+
remove_device_from_switch $HOST_IFNAME $BRIDGE
|
492
|
+
if [[ $? -ne 0 ]]; then
|
493
|
+
log_error removing device from bridge. aborting
|
494
|
+
RES=1
|
495
|
+
break
|
496
|
+
fi
|
497
|
+
|
498
|
+
$DEBUG - delete interfaces
|
499
|
+
delete_interfaces $HOST_IFNAME $CONTAINER_IFNAME $TARGET_PID $INTF
|
500
|
+
if [[ $? -ne 0 ]]; then
|
501
|
+
log_error deleting interfaces
|
502
|
+
RES=1
|
503
|
+
break
|
504
|
+
fi
|
505
|
+
done
|
506
|
+
|
507
|
+
unlink_netns $TARGET_PID
|
508
|
+
done
|
509
|
+
|
510
|
+
return $RES
|
511
|
+
}
|
512
|
+
|
513
|
+
# ========= MAIN ========================================================
|
514
|
+
|
515
|
+
if [[ "$ACTION" == "verify" ]]; then
|
516
|
+
handle_verify
|
517
|
+
if [[ $? -eq 0 ]]; then
|
518
|
+
log_ok
|
519
|
+
exit 0
|
520
|
+
else
|
521
|
+
echo FAILED
|
522
|
+
exit 100
|
523
|
+
fi
|
524
|
+
fi
|
525
|
+
|
526
|
+
if [[ "$ACTION" == "attach" ]]; then
|
527
|
+
handle_attach
|
528
|
+
if [[ $? -eq 0 ]]; then
|
529
|
+
log_ok
|
530
|
+
exit 0
|
531
|
+
else
|
532
|
+
echo FAILED
|
533
|
+
exit 100
|
534
|
+
fi
|
535
|
+
fi
|
536
|
+
|
537
|
+
if [[ "$ACTION" == "detach" ]]; then
|
538
|
+
handle_detach
|
539
|
+
if [[ $? -eq 0 ]]; then
|
540
|
+
log_ok
|
541
|
+
exit 0
|
542
|
+
else
|
543
|
+
echo FAILED
|
544
|
+
exit 100
|
545
|
+
fi
|
546
|
+
fi
|
547
|
+
|
data/lib/test_fig.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# The MIT License (MIT)
|
4
|
+
# Copyright (c) 2014 Andreas Schmidt, andreas@de-wiring.net
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
|
9
|
+
#
|
10
|
+
# modules
|
11
|
+
#
|
12
|
+
require_relative 'wire/common.rb'
|
13
|
+
require_relative 'wire/cli.rb'
|
14
|
+
require_relative 'wire/commands.rb'
|
15
|
+
require_relative 'wire/model.rb'
|
16
|
+
require_relative 'wire/execution.rb'
|
17
|
+
require_relative 'wire/resource.rb'
|
18
|
+
|
19
|
+
include Wire
|
20
|
+
|
21
|
+
$log.level = Logger::DEBUG
|
22
|
+
|
23
|
+
fa = Wire::Resource::FigAdapter.new('wiredmz', 'test/d1/fig/fig_dmz.yaml')
|
24
|
+
pp fa
|
25
|
+
|
26
|
+
$log.info 'Checking if containers are up'
|
27
|
+
r = fa.up?
|
28
|
+
$log.info "Result=#{r}"
|
29
|
+
|
30
|
+
$log.info 'Bringing it up...'
|
31
|
+
r = fa.up
|
32
|
+
$log.info "Result=#{r}"
|
33
|
+
|
34
|
+
$log.info 'Checking if containers are up'
|
35
|
+
r = fa.up?
|
36
|
+
$log.info "Result=#{r}"
|
37
|
+
|
38
|
+
$log.info "IDs=#{fa.up_ids}"
|
39
|
+
|
40
|
+
$log.info 'Taking it down...'
|
41
|
+
r = fa.down
|
42
|
+
$log.info "Result=#{r}"
|
43
|
+
|
44
|
+
$log.info 'Checking if containers are up'
|
45
|
+
r = fa.up?
|
46
|
+
$log.info "Result=#{r}"
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# The MIT License (MIT)
|
4
|
+
# Copyright (c) 2014 Andreas Schmidt, andreas@de-wiring.net
|
5
|
+
#
|
6
|
+
|
7
|
+
# Wire module
|
8
|
+
module Wire
|
9
|
+
# WireCLI
|
10
|
+
# thor command line class
|
11
|
+
#
|
12
|
+
class WireCommands
|
13
|
+
# internal array of +commands+ (as objects)
|
14
|
+
attr_reader :commands
|
15
|
+
|
16
|
+
# initialize wirecommands object
|
17
|
+
def initialize
|
18
|
+
initialize_commands
|
19
|
+
end
|
20
|
+
|
21
|
+
# pre-build array of available commands
|
22
|
+
# see @commands
|
23
|
+
def initialize_commands
|
24
|
+
@commands = {
|
25
|
+
:init_command => InitCommand.new,
|
26
|
+
:validate_command => ValidateCommand.new,
|
27
|
+
:verify_command => VerifyCommand.new,
|
28
|
+
:spec_command => SpecCommand.new,
|
29
|
+
:up_command => UpCommand.new,
|
30
|
+
:down_command => DownCommand.new
|
31
|
+
} unless @commands
|
32
|
+
end
|
33
|
+
|
34
|
+
# :reek:DuplicateCode
|
35
|
+
# run the init command on +target_dir+ model
|
36
|
+
def run_init(target_dir)
|
37
|
+
commands[:init_command].run({ :target_dir => target_dir })
|
38
|
+
end
|
39
|
+
|
40
|
+
# :reek:DuplicateCode
|
41
|
+
# run the validate command on +target_dir+ model
|
42
|
+
def run_validate(target_dir)
|
43
|
+
commands[:validate_command].run({ :target_dir => target_dir })
|
44
|
+
end
|
45
|
+
|
46
|
+
# run the verify command on +target_dir+ model
|
47
|
+
def run_verify(target_dir)
|
48
|
+
cmd_ver_obj = commands[:verify_command]
|
49
|
+
cmd_ver_obj.run({ :target_dir => target_dir })
|
50
|
+
if cmd_ver_obj.findings.size == 0
|
51
|
+
puts 'OK, system is conforming to model'.color(:green)
|
52
|
+
else
|
53
|
+
puts 'ERROR, detected inconsistencies/errors:'.color(:red)
|
54
|
+
cmd_ver_obj.findings.each do |val_error|
|
55
|
+
puts val_error.to_s
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# run the up command on +target_dir+ model
|
61
|
+
def run_up(target_dir)
|
62
|
+
# :reek:DuplicateCode
|
63
|
+
if commands[:up_command].run({ :target_dir => target_dir })
|
64
|
+
puts 'OK'.color(:green)
|
65
|
+
else
|
66
|
+
puts 'ERROR, detected errors'.color(:red)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# run the down command on +target_dir+ model
|
71
|
+
def run_down(target_dir)
|
72
|
+
# :reek:DuplicateCode
|
73
|
+
if commands[:down_command].run({ :target_dir => target_dir })
|
74
|
+
puts 'OK'.color(:green)
|
75
|
+
else
|
76
|
+
puts 'ERROR, detected errors'.color(:red)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# run the spec command on +target_dir+ model
|
81
|
+
def run_spec(target_dir, b_run)
|
82
|
+
commands[:spec_command].run({
|
83
|
+
:target_dir => target_dir,
|
84
|
+
:auto_run => b_run
|
85
|
+
})
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|