Skip to content

Commit

Permalink
support vpc objects
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaopal committed Jan 2, 2018
1 parent 117ae9a commit 59d8029
Show file tree
Hide file tree
Showing 7 changed files with 441 additions and 52 deletions.
54 changes: 53 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ npc_volumes:
capacity: 10G
npc_instances:
- name: test-vm
instance_type: {cpu: 2, memory: 4G}
instance_image: Debian 8.6
ssh_keys:
- Xiaohui-GRAYPC
Expand All @@ -160,4 +161,55 @@ npc_instances:
present: false
EOF
```
```

## 支持VPC (NEW)
```
# npc playbook --setup <<EOF
---
npc_ssh_key: { name: test-ssh-key }
npc_instances:
- name: vpc-instance-01
zone: cn-east-1b
instance_type: {series: 2, type: 2, cpu: 4, memory: 8G}
instance_image: Debian 8.6
vpc: test-vpc
vpc_subnet: default
vpc_security_group: test_group
vpc_inet: yes
vpc_inet_capacity: 10m
npc_vpc_networks:
- name: test-vpc
cidr: 10.177.0.0/16
npc_vpc_subnets:
- subnet: default/10.177.231.0/24 @test-vpc
zone: cn-east-1b
- subnet: 10.177.232.0/24 @test-vpc
zone: cn-east-1b
npc_vpc_security_groups:
- security_group: test_group @test-vpc
- security_group: unuse_group @test-vpc
present: no
npc_vpc_security_group_rules:
- rule: ingress, 0.0.0.0/0, icmp @test_group @test-vpc
- rule: ingress, default, all @test_group @test-vpc
- rule: ingress, 10.0.0.0/8, {icmp,tcp/22,tcp/80,tcp/443,tcp/8000-9000} @test_group @test-vpc
- rule: egress, 10.0.0.1, tcp/80-90 @test_group @test-vpc
present: no
npc_vpc_route_tables:
- route_table: main_route_table @test-vpc
- route_table: test_table @test-vpc
npc_vpc_routes:
- route: 192.168.99.0/24 @{main_route_table,test_table} @test-vpc
via_instance: vpc-instance-01
EOF
```
39 changes: 15 additions & 24 deletions files/npc-setup.ctx.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,30 +25,30 @@ jq_check(){
}

expand_resources(){
local LINE NAME FILTER="${1:-.}"
local LINE KEY FILTER="${1:-.}" KEY_ATTR="${EXPAND_KEY_ATTR:-name}"
while read -r LINE; do
local NAMES=($(eval "echo $(jq -r '.name|sub("^\\*\\:"; "")'<<<"$LINE")")) NAME_INDEX=0
for NAME in "${NAMES[@]}"; do
[ ! -z "$NAME" ] || continue
local KEYS=($(eval "echo $(jq -r ".$KEY_ATTR"'|gsub("^\\*\\:|[\\s\\$]"; "")'<<<"$LINE")")) KEY_INDEX=0
for KEY in "${KEYS[@]}"; do
[ ! -z "$KEY" ] || continue
while read -r STM_LINE; do
jq_check 'length>1 and (.[1]|strings|startswith("*:"))'<<<"$STM_LINE" || {
echo "$STM_LINE" && continue
}
local STM_VALS=($(eval "echo $(jq -r '.[1]|sub("^\\*\\:"; "")'<<<"$STM_LINE")")) STM_VAL_INDEX=0
local STM_VALS=($(eval "echo $(jq -r '.[1]|gsub("^\\*\\:|[\\s\\$]"; "")'<<<"$STM_LINE")")) STM_VAL_INDEX=0
for STM_VAL in "${STM_VALS[@]}"; do
(( STM_VAL_INDEX++ == NAME_INDEX % ${#STM_VALS[@]} )) \
(( STM_VAL_INDEX++ == KEY_INDEX % ${#STM_VALS[@]} )) \
&& STM_VAL="$STM_VAL" jq -c '[.[0],env.STM_VAL]' <<<"$STM_LINE"
done
done < <(NAME="$NAME" jq --argjson index "$((NAME_INDEX))" -c '. + {name:env.NAME, name_index:$index}|tostream'<<<"$LINE") \
| jq -s 'fromstream(.[])'; ((NAME_INDEX++))
done < <(KEY="$KEY" jq --argjson index "$((KEY_INDEX))" -c ". + {$KEY_ATTR:env.KEY, ${KEY_ATTR}_index:\$index}|tostream"<<<"$LINE") \
| jq -s 'fromstream(.[])'; ((KEY_INDEX++))
done
done < <(jq -c 'arrays[]') | jq -sc "$FILTER"
}

plan_resources(){
local STAGE="$1" INPUT_EXPECTED="$2" INPUT_ACTUAL="$3" STAGE_MAPPER="$4"
(jq -e 'arrays' $INPUT_EXPECTED || >>$STAGE.error) \
| expand_resources 'map({ key:.name, value:. }) | from_entries' >$STAGE.expected \
| EXPAND_KEY_ATTR='name' expand_resources 'map({ key:.name, value:. }) | from_entries' >$STAGE.expected \
&& [ ! -f $STAGE.error ] && jq_check 'objects' $STAGE.expected \
&& jq -c 'arrays| map({ key:.name, value:. }) | from_entries' $INPUT_ACTUAL >$STAGE.actual \
&& [ ! -f $STAGE.error ] && jq_check 'objects' $STAGE.actual \
Expand Down Expand Up @@ -197,11 +197,14 @@ checked_api(){
[ ! -z "$FILTER" ] && ARGS=("${ARGS[@]}" "$FILTER")
FILTER="$1" && shift
done; ARGS=("${ARGS[@]}" "$@")
local RESPONSE="$(npc ${CHECK_API:-api} --error "${ARGS[@]}")" && [ ! -z "$RESPONSE" ] || {

local DO_API=(npc ${NPC_API:-api})
[ ! -z "$NPC_API_LOCK" ] && DO_API=('flock' "$NPC_API_LOCK" "${DO_API[@]}")
local RESPONSE="$("${DO_API[@]}" --error "${ARGS[@]}")" && [ ! -z "$RESPONSE" ] || {
[ ! -z "$OPTION_SILENCE" ] || echo "[ERROR] No response." >&2
return 1
}
[ "${CHECK_API:-api}" == "api" ] && {
[ "${NPC_API:-api}" == "api" ] && {
jq_check .code <<<"$RESPONSE" && [ "$(jq -r .code <<<"$RESPONSE")" != "200" ] && {
[ ! -z "$OPTION_SILENCE" ] || echo "[ERROR] $RESPONSE" >&2
return 1
Expand All @@ -217,17 +220,5 @@ checked_api(){
}

checked_api2(){
CHECK_API=api2 checked_api "$@"
}

load_instances(){
local PAGE_SIZE=50 PAGE_NUM=1 FILTER="${1:-.}"
while (( PAGE_SIZE > 0 )); do
local PARAMS="pageSize=$PAGE_SIZE&pageNum=$PAGE_NUM" && PAGE_SIZE=0
while read -r INSTANCE_ENTRY; do
PAGE_SIZE=50 && jq -c "select(.)|$FILTER"<<<"$INSTANCE_ENTRY"
done < <(npc api 'json.instances[]' GET "/api/v1/vm/allInstanceInfo?$PARAMS")
(( PAGE_NUM += 1 ))
done | jq -sc '.'
return 0
NPC_API=api2 checked_api "$@"
}
2 changes: 1 addition & 1 deletion files/npc-setup.image.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ lookup_from_instance(){

instance_images_create(){
local IMAGE="$1" RESULT="$2" CTX="$3" && [ ! -z "$IMAGE" ] || return 1
local FROM_INSTANCE="$(lookup_from_instance "$(jq -r '.from_instance//empty'<<<"$IMAGE")")" \
local FROM_INSTANCE="$(INSTANCES_LOOKUP_KEY='from_instances' instances_lookup "$(jq -r '.from_instance//empty'<<<"$IMAGE")")" \
&& [ ! -z "$FROM_INSTANCE" ] || return 1
local SAVE_IMAGE="$(FROM_INSTANCE="$FROM_INSTANCE" jq -c '{
name: .name,
Expand Down
30 changes: 28 additions & 2 deletions files/npc-setup.instance.sh
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ instances_prepare(){
} | select(.wan_ip)//{}'<<<"$INSTANCE")"

local VPC_CONFIG="{}" VPC_NETWORK VPC_SUBNET VPC_SECURITY_GROUP
jq_check '.vpc_network'<<<"$INSTANCE" && {
VPC_NETWORK="$(vpc_networks_lookup "$(jq -r '.vpc_network//empty'<<<"$INSTANCE")")" \
jq_check '.vpc_network//.vpc'<<<"$INSTANCE" && {
VPC_NETWORK="$(vpc_networks_lookup "$(jq -r '.vpc_network//.vpc//empty'<<<"$INSTANCE")")" \
&& [ ! -z "$VPC_NETWORK" ] || return 1
VPC_SUBNET="$(vpc_subnets_lookup "$(jq -r '.vpc_subnet//empty'<<<"$INSTANCE")" "$VPC_NETWORK")" \
&& [ ! -z "$VPC_SUBNET" ] || return 1
Expand Down Expand Up @@ -348,3 +348,29 @@ instances_destroy(){
}
return 1
}

load_instances(){
local PAGE_SIZE=50 PAGE_NUM=1 FILTER="${1:-.}"
while (( PAGE_SIZE > 0 )); do
local PARAMS="pageSize=$PAGE_SIZE&pageNum=$PAGE_NUM" && PAGE_SIZE=0
while read -r INSTANCE_ENTRY; do
PAGE_SIZE=50 && jq -c "select(.)|$FILTER"<<<"$INSTANCE_ENTRY"
done < <(npc api 'json.instances[]' GET "/api/v1/vm/allInstanceInfo?$PARAMS")
(( PAGE_NUM += 1 ))
done | jq -sc '.'
return 0
}

instances_lookup(){
local INSTANCE="$1" FILTER="${2:-.id}" STAGE="$NPC_STAGE/${INSTANCES_LOOKUP_KEY:-instances}.lookup"
( exec 100>$STAGE.lock && flock 100
[ ! -f $STAGE ] && {
load_instances '{id: .uuid,name: .name}' >$STAGE || rm -f $STAGE
}
)
[ ! -z "$INSTANCE" ] && [ -f $STAGE ] && INSTANCE="$INSTANCE" \
jq_check --stdout '.[]|select(.id == env.INSTANCE or .name == env.INSTANCE)|'"$FILTER" $STAGE \
&& return 0
echo "[ERROR] instance '$INSTANCE' not found" >&2
return 1
}
Loading

0 comments on commit 59d8029

Please sign in to comment.