Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/.kodiak.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ strip_html_comments = true # default: false
always = true # default: false

[approve]
auto_approve_usernames = ["1gtm", "tamalsaha"]
auto_approve_usernames = ["tamalsaha", "1gtm", "1gtm-app[bot]"]
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,19 @@ jobs:
steps:

- name: Set up Go 1.23
uses: actions/setup-go@v1
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
with:
go-version: '1.23'
id: go

- uses: actions/checkout@v2
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v1
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0

- name: Run checks
run: |
Expand Down
9 changes: 1 addition & 8 deletions .github/workflows/release-tracker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@v1
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

- name: Prepare git
env:
Expand All @@ -25,15 +25,8 @@ jobs:
git config --global user.email "${GITHUB_USER}@appscode.com"
git remote set-url origin https://${GITHUB_USER}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git

- name: Install GitHub CLI
run: |
curl -fsSL https://github.com/github/hub/raw/master/script/get | bash -s 2.14.1
sudo mv bin/hub /usr/local/bin

- name: Update release tracker
if: |
github.event.action == 'closed' &&
github.event.pull_request.merged == true
env:
GITHUB_USER: 1gtm
GITHUB_TOKEN: ${{ secrets.LGTM_GITHUB_TOKEN }}
Expand Down
20 changes: 13 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ jobs:
build:
name: Build
runs-on: ubuntu-22.04
permissions:
contents: write
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

- name: Print version info
id: semver
Expand All @@ -25,23 +27,27 @@ jobs:

- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v1
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0

- name: Log in to the GitHub Container registry
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
with:
registry: ghcr.io
username: 1gtm
password: ${{ secrets.LGTM_GITHUB_TOKEN }}

- name: Publish to GitHub Container Registry
env:
REGISTRY: ghcr.io/appscode
DOCKER_TOKEN: ${{ secrets.LGTM_GITHUB_TOKEN }}
USERNAME: 1gtm
APPSCODE_ENV: prod
run: |
docker login ghcr.io --username ${USERNAME} --password ${DOCKER_TOKEN}
make release

- name: Release
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2
if: startsWith(github.ref, 'refs/tags/')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ SRC_REG ?=

# This version-strategy uses git tags to set the version string
git_branch := $(shell git rev-parse --abbrev-ref HEAD)
git_tag := $(shell git describe --exact-match --abbrev=0 2>/dev/null || echo "")
git_tag := $(shell git describe --tags --exact-match --abbrev=0 2>/dev/null || echo "")
commit_hash := $(shell git rev-parse --verify HEAD)
commit_timestamp := $(shell date --date="@$$(git show -s --format=%ct)" --utc +%FT%T)

Expand Down
2 changes: 1 addition & 1 deletion hack/scripts/update-release-tracker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,4 @@ case $GITHUB_BASE_REF in
;;
esac

hub api "$api_url" -f body="$msg"
gh api "$api_url" -f body="$msg"
100 changes: 63 additions & 37 deletions pkg/graph/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"sort"
"strings"

"github.com/jmespath/go-jmespath"
"gomodules.xyz/jsonpath"
core "k8s.io/api/core/v1"
kerr "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -304,25 +305,19 @@ func (finder ObjectFinder) ResourcesFor(src *unstructured.Unstructured, e *Edge)
// TODO: check that namespacePath must be empty

var out []*unstructured.Unstructured

for _, reference := range e.Connection.References {
j := jsonpath.New("jsonpath")
j.AllowMissingKeys(true)
err := j.Parse(reference)
if err != nil {
return nil, fmt.Errorf("fails to parse reference %q between %s -> %s. err:%v", e.Connection.References, e.Src, e.Dst, err)
}
buf := new(bytes.Buffer)
err = j.Execute(buf, src.Object)
if err != nil {
return nil, fmt.Errorf("fails to execute reference %q between %s -> %s. err:%v", e.Connection.References, e.Src, e.Dst, err)
}
r := csv.NewReader(buf)
// Mapper.Comma = ';'
r.Comment = '#'
records, err := r.ReadAll()
if err != nil {
return nil, err
var records [][]string
var err error
if strings.HasPrefix(reference, "jmes:") {
records, err = execJmesPath(src.Object, reference[5:], e.Src, e.Dst)
if err != nil {
return nil, err
}
} else {
records, err = execJsonPath(src.Object, reference, e.Src, e.Dst)
if err != nil {
return nil, err
}
}
refs, err := ParseResourceRefs(records)
if err != nil {
Expand Down Expand Up @@ -509,25 +504,18 @@ func (finder ObjectFinder) ResourcesFor(src *unstructured.Unstructured, e *Edge)
rs := result.Items[i]

for _, reference := range e.Connection.References {

j := jsonpath.New("jsonpath")
j.AllowMissingKeys(true)
err := j.Parse(reference)
if err != nil {
return nil, fmt.Errorf("fails to parse reference %q between %s -> %s. err:%v", e.Connection.References, e.Src, e.Dst, err)
}

buf := new(bytes.Buffer)
err = j.Execute(buf, rs.Object)
if err != nil {
return nil, fmt.Errorf("fails to execute reference %q between %s -> %s. err:%v", e.Connection.References, e.Src, e.Dst, err)
}
r := csv.NewReader(buf)
// Mapper.Comma = ';'
r.Comment = '#'
records, err := r.ReadAll()
if err != nil {
return nil, err
var records [][]string
var err error
if strings.HasPrefix(reference, "jmes:") {
records, err = execJmesPath(rs.Object, reference[5:], e.Src, e.Dst)
if err != nil {
return nil, err
}
} else {
records, err = execJsonPath(rs.Object, reference, e.Src, e.Dst)
if err != nil {
return nil, err
}
}
refs, err := ParseResourceRefs(records)
if err != nil {
Expand Down Expand Up @@ -581,6 +569,44 @@ func (finder ObjectFinder) ResourcesFor(src *unstructured.Unstructured, e *Edge)
return nil, nil
}

func execJmesPath(data any, reference string, src, dst schema.GroupVersionKind) ([][]string, error) {
result, err := jmespath.Search(reference, data)
if err != nil {
return nil, fmt.Errorf("fails to execute jmes reference %q between %s -> %s. err:%w", reference, src, dst, err)
}
switch v := result.(type) {
case string:
return [][]string{{v}}, nil
case []string:
out := make([][]string, len(v))
for i, s := range v {
out[i] = []string{s}
}
return out, nil
case [][]string:
return v, nil
}
return nil, fmt.Errorf("invalid result type %T for jmes reference %q between %s -> %s", result, reference, src, dst)
}

func execJsonPath(data any, reference string, src, dst schema.GroupVersionKind) ([][]string, error) {
j := jsonpath.New("jsonpath")
j.AllowMissingKeys(true)
err := j.Parse(reference)
if err != nil {
return nil, fmt.Errorf("fails to parse reference %q between %s -> %s. err:%v", reference, src, dst, err)
}
buf := new(bytes.Buffer)
err = j.Execute(buf, data)
if err != nil {
return nil, fmt.Errorf("fails to execute reference %q between %s -> %s. err:%v", reference, src, dst, err)
}
r := csv.NewReader(buf)
// Mapper.Comma = ';'
r.Comment = '#'
return r.ReadAll()
}

func isConnected(conn rsapi.OwnershipLevel, obj *unstructured.Unstructured, owner *unstructured.Unstructured) bool {
switch conn {
case rsapi.Controller:
Expand Down