gcloud でプロジェクトの切り替え設定

[gcloud config configurations](https://cloud.google.com/sdk/gcloud/reference/config/configurations/) を使ってプロジェクトの切り替えができるようにしておくのが良さそう。

## 認証

OAuth またはサービスアカウント.json で認証

```
$ gcloud auth login # OAuth
または
$ gcloud auth activate-service-account --key-file パス # Service Account
```

一覧

```
$ gcloud auth list
ACTIVE  ACCOUNT
        xxxx@developer.gserviceaccount.com
*       foo@example.com
```

あとで `gcloud config set account アカウント名` のようにして使う。
プロジェクトをまたいで使いまわすこともできる。

## 設定作成

```
$ gcloud config configurations create 任意の設定名
$ gcloud config set project プロジェクト名(aliasではない)
$ gcloud config set account アカウント名
```


## 設定一覧と切り替え

一覧

```
$ gcloud config configurations list
NAME  IS_ACTIVE  ACCOUNT                             PROJECT           DEFAULT_ZONE  DEFAULT_REGION
foo   False      xxxx@developer.gserviceaccount.com  foo-foo-217
bar   True       foo@example.com                     bar-bar-999
```

切り替え

```
$ gcloud config configurations activate 設定名
```

## カレント設定もしくはカレントプロジェクトの表示

```bash
$ gcloud config configurations list | grep True | awk '{print $1}'
設定名
$ gcloud config configurations list | grep True | awk '{print $4}'
プロジェクト名
```

多少もたつくので速度が欲しい場合(PROMPTに表示するなど)はこう

```bash
$ cat ~/.config/gcloud/active_config
設定名
$ cat ~/.config/gcloud/configurations/config_設定名 | grep 'project = ' | awk -F' = ' '{print $2}'
プロジェクト名
```

# もっと便利に

## [peco](https://github.com/peco/peco) および zsh completions で一覧からの選択切り替えができるようにしておくと便利

```zsh:.zshrc
function gcloud-activate() {
  name="$1"
  project="$2"
  echo "gcloud config configurations activate \"${name}\""
  gcloud config configurations activate "${name}"
}
function gx-complete() {
  _values $(gcloud config configurations list | awk '{print $1}')
}
function gx() {
  name="$1"
  if [ -z "$name" ]; then
    line=$(gcloud config configurations list | peco)
    name=$(echo "${line}" | awk '{print $1}')
  else
    line=$(gcloud config configurations list | grep "$name")
  fi
  project=$(echo "${line}" | awk '{print $4}')
  gcloud-activate "${name}" "${project}"
}
compdef gx-complete gx
```

`gx [TAB]` で補完が表示され、選択すると切り替え。
もしくは `gx[ENTER]` とすると peco で絞り込み検索ができます。

## GKEクラスタも一緒に切り替える

[kubectl でのクラスタの切り替え設定](https://qiita.com/sonots/items/f82912367693d717ff06)と連動させる。GKEを使っていないプロジェクトでも特に問題にはならないようにしてある。

前提: プロジェクトにGKEクラスタが１つしかないものとしている。複数GKEクラスタがある場合はさらに絞り込みかな。TODO

上記の `gcloud-activate` だけ置き換え。

```zsh:.zshrc
function gcloud-activate() {
  name="$1"
  project="$2"
  echo "gcloud config configurations activate \"${name}\""
  gcloud config configurations activate "${name}"
  cluster=$(kubectl config get-clusters | grep "${project}")
  if [ -n "${cluster}" ]; then; kubectl config use-context "${cluster}"; fi
}
```

## 設定名(別名)からプロジェクト名を取得する

```bash:.bashrc
# Get project real name
function gcloud-alias() {
    gcloud config configurations list | grep "^$1" | head -1 | awk '{print $4}'
}
```

多少もたつくので速さが欲しければこう

```bash:.bashrc
# Get project real name
function gcloud-alias() {
    grep 'project = ' "$HOME/.config/gcloud/configurations/config_$1" | awk -F' = ' '{print $2}'
}
```

使い方

```
$ gcloud-alias 設定名
プロジェクト名
```

## カレント設定を取得する

```bash:.bashrc
function gcloud-current() {
    cat $HOME/.config/gcloud/active_config
}
```

## PROMPTにカレント設定を表示する

```bash:.bashrc
PROMPT='あなたのいつもの設定($(gcloud-current))$ '
```

とか