summary refs log tree commit diff
path: root/pkgs/applications/networking/cluster/terraform-providers/update-provider
blob: 4d380a141b8f370f956bc36826382c9d52f9185a (plain) (blame)
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
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p coreutils curl git jq moreutils nix nurl
# shellcheck shell=bash
# vim: ft=sh
#
# Update a terraform provider to the latest version advertised at the
# provider source address.
#
set -euo pipefail
shopt -s inherit_errexit

show_usage() {
  cat <<DOC
Usage: ./update-provider [--force] [--no-build] [<owner>/]<provider>

Update a single provider in the providers.json inventory file.

For example to update 'terraform-providers.aws' run:

    ./update-provider aws

If the provider is not in the list already, use the form '<owner>/<provider>'
to add the provider to the list:

    ./update-provider hetznercloud/hcloud

Options:

  * --force: Force the update even if the version matches.
  * --no-build: Don't build provider
DOC
}

build=1
force=
provider=
spdx=1

while [[ $# -gt 0 ]]; do
  case "$1" in
  -h | --help)
    show_usage
    exit
    ;;
  --force)
    force=1
    shift
    ;;
  --no-build)
    build=0
    shift
    ;;
  --no-spdx)
    spdx=0
    shift
    ;;
  *)
    if [[ -n ${provider} ]]; then
      echo "ERROR: provider name was passed two times: '${provider}' and '$1'"
      echo "Use --help for more info"
      exit 1
    fi
    provider=$1
    shift
    ;;
  esac
done

if [[ -z ${provider} ]]; then
  echo "ERROR: No providers specified!"
  echo
  show_usage
  exit 1
fi

# Usage: read_attr <key>
read_attr() {
  jq -r ".\"${provider}\".\"$1\"" providers.json
}

# Usage: update_attr <key> <value>
update_attr() {
  if [[ $2 == "null" ]]; then
    jq -S ".\"${provider}\".\"$1\" = null" providers.json | sponge providers.json
  else
    jq -S ".\"${provider}\".\"$1\" = \"$2\"" providers.json | sponge providers.json
  fi
}

repo_root=$(git rev-parse --show-toplevel)

generate_hash() {
  nurl --expr "(import ${repo_root} {}).terraform-providers.${provider}.$1"
}

echo_provider() {
  echo "== terraform-providers.${provider}: $* =="
}

pushd "$(dirname "$0")" >/dev/null

if [[ ${provider} =~ ^[^/]+/[^/]+$ ]]; then
  homepage="https://registry.terraform.io/providers/${provider}"
  provider=$(basename "${provider}")
  echo_provider "init"
  update_attr homepage "${homepage}"
  # create empty stings so nix-prefetch works
  update_attr hash ""
  update_attr vendorHash ""
  update_attr spdx ""
fi

homepage="$(read_attr homepage)"

registry_response=$(curl -s "${homepage//providers/v1/providers}")

old_rev="$(read_attr rev)"
rev="$(jq -r '.tag' <<<"${registry_response}")"
if [[ ${force} != 1 ]]; then
  if [[ ${old_rev} == "${rev}" ]]; then
    echo_provider "already at version ${rev}"
    exit
  fi
  if [[ ${rev//v/} =~ [[:alpha:]] ]]; then
    echo_provider "not updating to unstable version ${rev}"
    exit
  fi
fi
echo_provider "updating from ${old_rev} to ${rev}"
update_attr rev "${rev}"

provider_source_url="$(jq -r '.source' <<<"${registry_response}")"

org="$(echo "${provider_source_url}" | cut -d '/' -f 4)"
update_attr owner "${org}"
repo="$(echo "${provider_source_url}" | cut -d '/' -f 5)"
update_attr repo "${repo}"

if [[ ${spdx} == 1 ]]; then
  old_spdx="$(read_attr spdx)"
  if [[ ${old_spdx} != null ]]; then
    spdx="$(curl -L -s ${GITHUB_TOKEN:+-u ":${GITHUB_TOKEN}"} "https://api.github.com/repos/${org}/${repo}/license" | jq -r '.license.spdx_id')"
    update_attr spdx "${spdx}"
  fi
fi

echo_provider "calculating hash"
hash=$(generate_hash src)
update_attr hash "${hash}"

old_vendor_hash="$(read_attr vendorHash)"
if [[ ${old_vendor_hash} != null ]]; then
  echo_provider "calculating vendorHash"
  vendorHash=$(generate_hash goModules)
  update_attr vendorHash "${vendorHash}"
fi

# Check that the provider builds
if [[ ${build} == 1 ]]; then
  echo_provider "building"
  nix-build --no-out-link "${repo_root}" -A "terraform-providers.${provider}"
fi

popd >/dev/null