vars: behaviour: properly handle local scope

I realized that local scope wasn't being handled properly before. We
created a clone of the local vars when we called `NewLocalScope`, but
local vars are typically populated at runtime - not in the
`engine/builder`. So, the clone was always empty. Instead, form a linked
list of `BuildVariables` that point to its parent scope.

This commit also renames `CredVarsTracker` to `BuildVariables`, and
exposes the struct directly rather than an interface. This commit is
incomplete in the sense that it doesn't perform that renaming
everywhere, but the diff got pretty huge and I wanted to separate out
just the behaviour aspect of this change.

Signed-off-by: Aidan Oldershaw <aoldershaw@pivotal.io>
This commit is contained in:
Aidan Oldershaw 2020-08-16 11:22:16 -04:00
parent f7a8755916
commit 41c606daa6
8 changed files with 552 additions and 721 deletions

69
vars/build_vars.go Normal file
View File

@ -0,0 +1,69 @@
package vars
type BuildVariables struct {
parentScope interface {
Variables
IterateInterpolatedCreds(iter TrackedVarsIterator)
}
localVars StaticVariables
tracker *tracker
}
func NewBuildVariables(credVars Variables, enableRedaction bool) *BuildVariables {
return &BuildVariables{
parentScope: &credVarsTracker{
credVars: credVars,
tracker: newTracker(enableRedaction),
},
localVars: StaticVariables{},
tracker: newTracker(enableRedaction),
}
}
func (b *BuildVariables) Get(varDef VariableDefinition) (interface{}, bool, error) {
if varDef.Ref.Source == "." {
val, found, _ := b.localVars.Get(varDef)
if found {
return val, true, nil
}
}
return b.parentScope.Get(varDef)
}
func (b *BuildVariables) List() ([]VariableDefinition, error) {
list, err := b.parentScope.List()
if err != nil {
return nil, err
}
for k := range b.localVars {
list = append(list, VariableDefinition{
Ref: VariableReference{Source: ".", Path: k},
})
}
return list, nil
}
func (b *BuildVariables) IterateInterpolatedCreds(iter TrackedVarsIterator) {
b.tracker.IterateInterpolatedCreds(iter)
b.parentScope.IterateInterpolatedCreds(iter)
}
func (b *BuildVariables) NewLocalScope() *BuildVariables {
return &BuildVariables{
parentScope: b,
localVars: StaticVariables{},
tracker: newTracker(b.tracker.enabled),
}
}
func (b *BuildVariables) AddLocalVar(name string, val interface{}, redact bool) {
b.localVars[name] = val
if redact {
b.tracker.Track(VariableReference{Source: ".", Path: name}, val)
}
}
func (b *BuildVariables) RedactionEnabled() bool {
return b.tracker.enabled
}

195
vars/build_vars_test.go Normal file
View File

@ -0,0 +1,195 @@
package vars_test
import (
"github.com/concourse/concourse/vars"
. "github.com/concourse/concourse/vars"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("BuildVariables", func() {
var buildVars *vars.BuildVariables
Describe("turn on track", func() {
BeforeEach(func() {
buildVars = vars.NewBuildVariables(StaticVariables{"k1": "v1", "k2": "v2", "k3": "v3"}, true)
})
Describe("Get", func() {
It("returns expected value", func() {
val, found, err := buildVars.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
Expect(found).To(BeTrue())
Expect(err).To(BeNil())
Expect(val).To(Equal("v1"))
})
It("fetched variables are tracked", func() {
buildVars.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
buildVars.Get(VariableDefinition{Ref: VariableReference{Path: "k2"}})
mapit := vars.TrackedVarsMap{}
buildVars.IterateInterpolatedCreds(mapit)
Expect(mapit["k1"]).To(Equal("v1"))
Expect(mapit["k2"]).To(Equal("v2"))
// "k3" has not been Get, thus should not be tracked.
Expect(mapit).ToNot(HaveKey("k3"))
})
})
Describe("List", func() {
It("returns list of names from multiple vars with duplicates", func() {
defs, err := buildVars.List()
Expect(defs).To(ConsistOf([]VariableDefinition{
{Ref: VariableReference{Path: "k1"}},
{Ref: VariableReference{Path: "k2"}},
{Ref: VariableReference{Path: "k3"}},
}))
Expect(err).ToNot(HaveOccurred())
})
It("includes all local vars", func() {
buildVars.AddLocalVar("l1", 1, false)
buildVars.AddLocalVar("l2", 2, false)
defs, err := buildVars.List()
Expect(defs).To(ConsistOf([]VariableDefinition{
{Ref: VariableReference{Source: ".", Path: "l1"}},
{Ref: VariableReference{Source: ".", Path: "l2"}},
{Ref: VariableReference{Path: "k1"}},
{Ref: VariableReference{Path: "k2"}},
{Ref: VariableReference{Path: "k3"}},
}))
Expect(err).ToNot(HaveOccurred())
})
})
Describe("AddLocalVar", func() {
Describe("redact", func() {
BeforeEach(func() {
buildVars.AddLocalVar("foo", "bar", true)
})
It("should get local value", func() {
val, found, err := buildVars.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "foo"}})
Expect(err).To(BeNil())
Expect(found).To(BeTrue())
Expect(val).To(Equal("bar"))
})
It("fetched variables are tracked when added", func() {
mapit := vars.TrackedVarsMap{}
buildVars.IterateInterpolatedCreds(mapit)
Expect(mapit["foo"]).To(Equal("bar"))
})
})
})
Describe("NewLocalScope", func() {
It("can access local vars from parent scope", func() {
buildVars.AddLocalVar("hello", "world", false)
scope := buildVars.NewLocalScope()
val, _, _ := scope.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "hello"}})
Expect(val).To(Equal("world"))
})
It("adding local vars does not affect the original tracker", func() {
scope := buildVars.NewLocalScope()
scope.AddLocalVar("hello", "world", false)
_, found, _ := buildVars.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "hello"}})
Expect(found).To(BeFalse())
})
It("shares the underlying non-local variables", func() {
scope := buildVars.NewLocalScope()
val, _, _ := scope.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
Expect(val).To(Equal("v1"))
})
It("local vars added after creating the subscope are accessible", func() {
scope := buildVars.NewLocalScope()
buildVars.AddLocalVar("hello", "world", false)
val, _, _ := scope.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "hello"}})
Expect(val).To(Equal("world"))
})
It("current scope is preferred over parent scope", func() {
buildVars.AddLocalVar("a", 1, false)
scope := buildVars.NewLocalScope()
scope.AddLocalVar("a", 2, false)
val, _, _ := scope.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "a"}})
Expect(val).To(Equal(2))
})
Describe("TrackedVarsMap", func() {
It("prefers the value set in the current scope over the parent scope", func() {
buildVars.AddLocalVar("a", "from parent", true)
scope := buildVars.NewLocalScope()
scope.AddLocalVar("a", "from child", true)
mapit := vars.TrackedVarsMap{}
scope.IterateInterpolatedCreds(mapit)
Expect(mapit["a"]).To(Equal("from child"))
})
})
})
Describe("not redact", func() {
BeforeEach(func() {
buildVars.AddLocalVar("foo", "bar", false)
})
It("should get local value", func() {
val, found, err := buildVars.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "foo"}})
Expect(err).To(BeNil())
Expect(found).To(BeTrue())
Expect(val).To(Equal("bar"))
})
It("fetched variables are not tracked", func() {
buildVars.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "foo"}})
mapit := vars.TrackedVarsMap{}
buildVars.IterateInterpolatedCreds(mapit)
Expect(mapit).ToNot(ContainElement("foo"))
})
})
})
Describe("turn off track", func() {
BeforeEach(func() {
buildVars = vars.NewBuildVariables(StaticVariables{"k1": "v1", "k2": "v2", "k3": "v3"}, false)
})
Describe("Get", func() {
It("returns expected value", func() {
val, found, err := buildVars.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
Expect(found).To(BeTrue())
Expect(err).To(BeNil())
Expect(val).To(Equal("v1"))
})
It("fetched variables should not be tracked", func() {
buildVars.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
buildVars.Get(VariableDefinition{Ref: VariableReference{Path: "k2"}})
mapit := vars.TrackedVarsMap{}
buildVars.IterateInterpolatedCreds(mapit)
Expect(mapit).ToNot(HaveKey("k1"))
Expect(mapit).ToNot(HaveKey("k2"))
Expect(mapit).ToNot(HaveKey("k3"))
})
})
Describe("List", func() {
It("returns list of names from multiple vars with duplicates", func() {
defs, err := buildVars.List()
Expect(defs).To(ConsistOf([]VariableDefinition{
{Ref: VariableReference{Path: "k1"}},
{Ref: VariableReference{Path: "k2"}},
{Ref: VariableReference{Path: "k3"}},
}))
Expect(err).ToNot(HaveOccurred())
})
})
})
})

97
vars/tracker.go Normal file
View File

@ -0,0 +1,97 @@
package vars
import (
"strings"
"sync"
)
type TrackedVarsIterator interface {
YieldCred(string, string)
}
type tracker struct {
enabled bool
// Considering in-parallel steps, a lock is need.
lock sync.RWMutex
interpolatedCreds map[string]string
}
func newTracker(on bool) *tracker {
return &tracker{
enabled: on,
interpolatedCreds: map[string]string{},
}
}
func (t *tracker) Track(varRef VariableReference, val interface{}) {
if !t.enabled {
return
}
t.lock.Lock()
defer t.lock.Unlock()
t.track(varRef, val)
}
func (t *tracker) track(varRef VariableReference, val interface{}) {
switch v := val.(type) {
case map[interface{}]interface{}:
for kk, vv := range v {
t.track(VariableReference{
Path: varRef.Path,
Fields: append(varRef.Fields, kk.(string)),
}, vv)
}
case map[string]interface{}:
for kk, vv := range v {
t.track(VariableReference{
Path: varRef.Path,
Fields: append(varRef.Fields, kk),
}, vv)
}
case string:
paths := append([]string{varRef.Path}, varRef.Fields...)
t.interpolatedCreds[strings.Join(paths, ".")] = v
default:
// Do nothing
}
}
func (t *tracker) IterateInterpolatedCreds(iter TrackedVarsIterator) {
t.lock.RLock()
for k, v := range t.interpolatedCreds {
iter.YieldCred(k, v)
}
t.lock.RUnlock()
}
type credVarsTracker struct {
*tracker
credVars Variables
}
func (t *credVarsTracker) Get(varDef VariableDefinition) (interface{}, bool, error) {
val, found, err := t.credVars.Get(varDef)
if found {
t.tracker.Track(varDef.Ref, val)
}
return val, found, err
}
func (t *credVarsTracker) List() ([]VariableDefinition, error) {
return t.credVars.List()
}
// TrackedVarsMap is a TrackedVarsIterator which populates interpolated secrets into a map.
// If there are multiple secrets with the same name, it only keeps the first value.
type TrackedVarsMap map[string]string
func (it TrackedVarsMap) YieldCred(k, v string) {
_, found := it[k]
if !found {
it[k] = v
}
}

View File

@ -1,5 +1,7 @@
package vars
//go:generate counterfeiter . Variables
type Variables interface {
Get(VariableDefinition) (interface{}, bool, error)
List() ([]VariableDefinition, error)

View File

@ -1,152 +0,0 @@
package vars
import (
"strings"
"sync"
)
// CredVarsTracker implements the interface Variables. It wraps a secret manager and
// tracks key-values fetched from the secret managers. It also provides a method to
// thread-safely iterate interpolated key-values.
type CredVarsTrackerIterator interface {
YieldCred(string, string)
}
//go:generate counterfeiter . CredVarsTracker
type CredVarsTracker interface {
Variables
IterateInterpolatedCreds(iter CredVarsTrackerIterator)
Enabled() bool
NewLocalScope() CredVarsTracker
AddLocalVar(string, interface{}, bool)
}
func NewCredVarsTracker(credVars Variables, on bool) CredVarsTracker {
return &credVarsTracker{
localVars: StaticVariables{},
credVars: credVars,
enabled: on,
interpolatedCreds: map[string]string{},
noRedactVarNames: map[string]bool{},
}
}
type credVarsTracker struct {
credVars Variables
localVars StaticVariables
enabled bool
interpolatedCreds map[string]string
noRedactVarNames map[string]bool
// Considering in-parallel steps, a lock is need.
lock sync.RWMutex
}
func (t *credVarsTracker) Get(varDef VariableDefinition) (interface{}, bool, error) {
var (
val interface{}
found bool
err error
)
redact := true
if varDef.Ref.Source == "." {
val, found, err = t.localVars.Get(varDef)
if found {
if _, ok := t.noRedactVarNames[varDef.Ref.Path]; ok {
redact = false
}
}
} else {
val, found, err = t.credVars.Get(varDef)
}
if t.enabled && found && redact {
t.lock.Lock()
t.track(varDef.Ref, val)
t.lock.Unlock()
}
return val, found, err
}
func (t *credVarsTracker) track(varRef VariableReference, val interface{}) {
switch v := val.(type) {
case map[interface{}]interface{}:
for kk, vv := range v {
t.track(VariableReference{
Path: varRef.Path,
Fields: append(varRef.Fields, kk.(string)),
}, vv)
}
case map[string]interface{}:
for kk, vv := range v {
t.track(VariableReference{
Path: varRef.Path,
Fields: append(varRef.Fields, kk),
}, vv)
}
case string:
paths := append([]string{varRef.Path}, varRef.Fields...)
t.interpolatedCreds[strings.Join(paths, ".")] = v
default:
// Do nothing
}
}
func (t *credVarsTracker) List() ([]VariableDefinition, error) {
return t.credVars.List()
}
func (t *credVarsTracker) IterateInterpolatedCreds(iter CredVarsTrackerIterator) {
t.lock.RLock()
for k, v := range t.interpolatedCreds {
iter.YieldCred(k, v)
}
t.lock.RUnlock()
}
func (t *credVarsTracker) Enabled() bool {
return t.enabled
}
func (t *credVarsTracker) NewLocalScope() CredVarsTracker {
localVarsClone := make(StaticVariables, len(t.localVars))
for k, v := range t.localVars {
localVarsClone[k] = v
}
noRedactVarNamesClone := make(map[string]bool, len(t.noRedactVarNames))
for k, v := range t.noRedactVarNames {
noRedactVarNamesClone[k] = v
}
interpolatedCredsClone := MapCredVarsTrackerIterator{}
t.IterateInterpolatedCreds(interpolatedCredsClone)
return &credVarsTracker{
credVars: t.credVars,
enabled: t.enabled,
localVars: localVarsClone,
noRedactVarNames: noRedactVarNamesClone,
interpolatedCreds: interpolatedCredsClone,
}
}
func (t *credVarsTracker) AddLocalVar(name string, value interface{}, redact bool) {
t.localVars[name] = value
if !redact {
t.noRedactVarNames[name] = true
}
}
// MapCredVarsTrackerIterator implements a simple CredVarsTrackerIterator which just
// populate interpolated secrets into a map.
type MapCredVarsTrackerIterator map[string]string
func (it MapCredVarsTrackerIterator) YieldCred(k, v string) {
it[k] = v
}

View File

@ -1,172 +0,0 @@
package vars_test
import (
. "github.com/concourse/concourse/vars"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("vars_tracker", func() {
var tracker CredVarsTracker
Describe("turn on track", func() {
BeforeEach(func() {
v := StaticVariables{"k1": "v1", "k2": "v2", "k3": "v3"}
tracker = NewCredVarsTracker(v, true)
})
Describe("Get", func() {
It("returns expected value", func() {
var (
val interface{}
found bool
err error
)
val, found, err = tracker.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
Expect(found).To(BeTrue())
Expect(err).To(BeNil())
Expect(val).To(Equal("v1"))
})
It("fetched variables are tracked", func() {
tracker.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
tracker.Get(VariableDefinition{Ref: VariableReference{Path: "k2"}})
mapit := MapCredVarsTrackerIterator{}
tracker.IterateInterpolatedCreds(mapit)
Expect(mapit["k1"]).To(Equal("v1"))
Expect(mapit["k2"]).To(Equal("v2"))
// "k3" has not been Get, thus should not be tracked.
Expect(mapit).ToNot(ContainElement("k3"))
})
})
Describe("List", func() {
It("returns list of names from multiple vars with duplicates", func() {
defs, err := tracker.List()
Expect(defs).To(ConsistOf([]VariableDefinition{
{Ref: VariableReference{Path: "k1"}},
{Ref: VariableReference{Path: "k2"}},
{Ref: VariableReference{Path: "k3"}},
}))
Expect(err).ToNot(HaveOccurred())
})
})
Describe("AddLocalVar", func() {
Describe("redact", func() {
BeforeEach(func() {
tracker.AddLocalVar("foo", "bar", true)
})
It("should get local value", func() {
var (
val interface{}
found bool
err error
)
val, found, err = tracker.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "foo"}})
Expect(err).To(BeNil())
Expect(found).To(BeTrue())
Expect(val).To(Equal("bar"))
})
It("fetched variables are tracked", func() {
tracker.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "foo"}})
mapit := MapCredVarsTrackerIterator{}
tracker.IterateInterpolatedCreds(mapit)
Expect(mapit["foo"]).To(Equal("bar"))
})
})
})
Describe("NewLocalScope", func() {
It("copies all existing local vars", func() {
tracker.AddLocalVar("hello", "world", false)
scope := tracker.NewLocalScope()
val, _, _ := scope.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "hello"}})
Expect(val).To(Equal("world"))
})
It("adding local vars does not affect the original tracker", func() {
scope := tracker.NewLocalScope()
scope.AddLocalVar("hello", "world", false)
_, found, _ := tracker.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "hello"}})
Expect(found).To(BeFalse())
})
It("shares the underlying non-local variables", func() {
scope := tracker.NewLocalScope()
val, _, _ := scope.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
Expect(val).To(Equal("v1"))
})
})
Describe("not redact", func() {
BeforeEach(func() {
tracker.AddLocalVar("foo", "bar", false)
})
It("should get local value", func() {
var (
val interface{}
found bool
err error
)
val, found, err = tracker.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "foo"}})
Expect(err).To(BeNil())
Expect(found).To(BeTrue())
Expect(val).To(Equal("bar"))
})
It("fetched variables are not tracked", func() {
tracker.Get(VariableDefinition{Ref: VariableReference{Source: ".", Path: "foo"}})
mapit := MapCredVarsTrackerIterator{}
tracker.IterateInterpolatedCreds(mapit)
Expect(mapit).ToNot(ContainElement("foo"))
})
})
})
Describe("turn off track", func() {
BeforeEach(func() {
v := StaticVariables{"k1": "v1", "k2": "v2", "k3": "v3"}
tracker = NewCredVarsTracker(v, false)
})
Describe("Get", func() {
It("returns expected value", func() {
var (
val interface{}
found bool
err error
)
val, found, err = tracker.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
Expect(found).To(BeTrue())
Expect(err).To(BeNil())
Expect(val).To(Equal("v1"))
})
It("fetched variables should not be tracked", func() {
tracker.Get(VariableDefinition{Ref: VariableReference{Path: "k1"}})
tracker.Get(VariableDefinition{Ref: VariableReference{Path: "k2"}})
mapit := MapCredVarsTrackerIterator{}
tracker.IterateInterpolatedCreds(mapit)
Expect(mapit).ToNot(ContainElement("k1"))
Expect(mapit).ToNot(ContainElement("k2"))
Expect(mapit).ToNot(ContainElement("k3"))
})
})
Describe("List", func() {
It("returns list of names from multiple vars with duplicates", func() {
defs, err := tracker.List()
Expect(defs).To(ConsistOf([]VariableDefinition{
{Ref: VariableReference{Path: "k1"}},
{Ref: VariableReference{Path: "k2"}},
{Ref: VariableReference{Path: "k3"}},
}))
Expect(err).ToNot(HaveOccurred())
})
})
})
})

View File

@ -1,397 +0,0 @@
// Code generated by counterfeiter. DO NOT EDIT.
package varsfakes
import (
"sync"
"github.com/concourse/concourse/vars"
)
type FakeCredVarsTracker struct {
AddLocalVarStub func(string, interface{}, bool)
addLocalVarMutex sync.RWMutex
addLocalVarArgsForCall []struct {
arg1 string
arg2 interface{}
arg3 bool
}
EnabledStub func() bool
enabledMutex sync.RWMutex
enabledArgsForCall []struct {
}
enabledReturns struct {
result1 bool
}
enabledReturnsOnCall map[int]struct {
result1 bool
}
GetStub func(vars.VariableDefinition) (interface{}, bool, error)
getMutex sync.RWMutex
getArgsForCall []struct {
arg1 vars.VariableDefinition
}
getReturns struct {
result1 interface{}
result2 bool
result3 error
}
getReturnsOnCall map[int]struct {
result1 interface{}
result2 bool
result3 error
}
IterateInterpolatedCredsStub func(vars.CredVarsTrackerIterator)
iterateInterpolatedCredsMutex sync.RWMutex
iterateInterpolatedCredsArgsForCall []struct {
arg1 vars.CredVarsTrackerIterator
}
ListStub func() ([]vars.VariableDefinition, error)
listMutex sync.RWMutex
listArgsForCall []struct {
}
listReturns struct {
result1 []vars.VariableDefinition
result2 error
}
listReturnsOnCall map[int]struct {
result1 []vars.VariableDefinition
result2 error
}
NewLocalScopeStub func() vars.CredVarsTracker
newLocalScopeMutex sync.RWMutex
newLocalScopeArgsForCall []struct {
}
newLocalScopeReturns struct {
result1 vars.CredVarsTracker
}
newLocalScopeReturnsOnCall map[int]struct {
result1 vars.CredVarsTracker
}
invocations map[string][][]interface{}
invocationsMutex sync.RWMutex
}
func (fake *FakeCredVarsTracker) AddLocalVar(arg1 string, arg2 interface{}, arg3 bool) {
fake.addLocalVarMutex.Lock()
fake.addLocalVarArgsForCall = append(fake.addLocalVarArgsForCall, struct {
arg1 string
arg2 interface{}
arg3 bool
}{arg1, arg2, arg3})
fake.recordInvocation("AddLocalVar", []interface{}{arg1, arg2, arg3})
fake.addLocalVarMutex.Unlock()
if fake.AddLocalVarStub != nil {
fake.AddLocalVarStub(arg1, arg2, arg3)
}
}
func (fake *FakeCredVarsTracker) AddLocalVarCallCount() int {
fake.addLocalVarMutex.RLock()
defer fake.addLocalVarMutex.RUnlock()
return len(fake.addLocalVarArgsForCall)
}
func (fake *FakeCredVarsTracker) AddLocalVarCalls(stub func(string, interface{}, bool)) {
fake.addLocalVarMutex.Lock()
defer fake.addLocalVarMutex.Unlock()
fake.AddLocalVarStub = stub
}
func (fake *FakeCredVarsTracker) AddLocalVarArgsForCall(i int) (string, interface{}, bool) {
fake.addLocalVarMutex.RLock()
defer fake.addLocalVarMutex.RUnlock()
argsForCall := fake.addLocalVarArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
}
func (fake *FakeCredVarsTracker) Enabled() bool {
fake.enabledMutex.Lock()
ret, specificReturn := fake.enabledReturnsOnCall[len(fake.enabledArgsForCall)]
fake.enabledArgsForCall = append(fake.enabledArgsForCall, struct {
}{})
fake.recordInvocation("Enabled", []interface{}{})
fake.enabledMutex.Unlock()
if fake.EnabledStub != nil {
return fake.EnabledStub()
}
if specificReturn {
return ret.result1
}
fakeReturns := fake.enabledReturns
return fakeReturns.result1
}
func (fake *FakeCredVarsTracker) EnabledCallCount() int {
fake.enabledMutex.RLock()
defer fake.enabledMutex.RUnlock()
return len(fake.enabledArgsForCall)
}
func (fake *FakeCredVarsTracker) EnabledCalls(stub func() bool) {
fake.enabledMutex.Lock()
defer fake.enabledMutex.Unlock()
fake.EnabledStub = stub
}
func (fake *FakeCredVarsTracker) EnabledReturns(result1 bool) {
fake.enabledMutex.Lock()
defer fake.enabledMutex.Unlock()
fake.EnabledStub = nil
fake.enabledReturns = struct {
result1 bool
}{result1}
}
func (fake *FakeCredVarsTracker) EnabledReturnsOnCall(i int, result1 bool) {
fake.enabledMutex.Lock()
defer fake.enabledMutex.Unlock()
fake.EnabledStub = nil
if fake.enabledReturnsOnCall == nil {
fake.enabledReturnsOnCall = make(map[int]struct {
result1 bool
})
}
fake.enabledReturnsOnCall[i] = struct {
result1 bool
}{result1}
}
func (fake *FakeCredVarsTracker) Get(arg1 vars.VariableDefinition) (interface{}, bool, error) {
fake.getMutex.Lock()
ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)]
fake.getArgsForCall = append(fake.getArgsForCall, struct {
arg1 vars.VariableDefinition
}{arg1})
fake.recordInvocation("Get", []interface{}{arg1})
fake.getMutex.Unlock()
if fake.GetStub != nil {
return fake.GetStub(arg1)
}
if specificReturn {
return ret.result1, ret.result2, ret.result3
}
fakeReturns := fake.getReturns
return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3
}
func (fake *FakeCredVarsTracker) GetCallCount() int {
fake.getMutex.RLock()
defer fake.getMutex.RUnlock()
return len(fake.getArgsForCall)
}
func (fake *FakeCredVarsTracker) GetCalls(stub func(vars.VariableDefinition) (interface{}, bool, error)) {
fake.getMutex.Lock()
defer fake.getMutex.Unlock()
fake.GetStub = stub
}
func (fake *FakeCredVarsTracker) GetArgsForCall(i int) vars.VariableDefinition {
fake.getMutex.RLock()
defer fake.getMutex.RUnlock()
argsForCall := fake.getArgsForCall[i]
return argsForCall.arg1
}
func (fake *FakeCredVarsTracker) GetReturns(result1 interface{}, result2 bool, result3 error) {
fake.getMutex.Lock()
defer fake.getMutex.Unlock()
fake.GetStub = nil
fake.getReturns = struct {
result1 interface{}
result2 bool
result3 error
}{result1, result2, result3}
}
func (fake *FakeCredVarsTracker) GetReturnsOnCall(i int, result1 interface{}, result2 bool, result3 error) {
fake.getMutex.Lock()
defer fake.getMutex.Unlock()
fake.GetStub = nil
if fake.getReturnsOnCall == nil {
fake.getReturnsOnCall = make(map[int]struct {
result1 interface{}
result2 bool
result3 error
})
}
fake.getReturnsOnCall[i] = struct {
result1 interface{}
result2 bool
result3 error
}{result1, result2, result3}
}
func (fake *FakeCredVarsTracker) IterateInterpolatedCreds(arg1 vars.CredVarsTrackerIterator) {
fake.iterateInterpolatedCredsMutex.Lock()
fake.iterateInterpolatedCredsArgsForCall = append(fake.iterateInterpolatedCredsArgsForCall, struct {
arg1 vars.CredVarsTrackerIterator
}{arg1})
fake.recordInvocation("IterateInterpolatedCreds", []interface{}{arg1})
fake.iterateInterpolatedCredsMutex.Unlock()
if fake.IterateInterpolatedCredsStub != nil {
fake.IterateInterpolatedCredsStub(arg1)
}
}
func (fake *FakeCredVarsTracker) IterateInterpolatedCredsCallCount() int {
fake.iterateInterpolatedCredsMutex.RLock()
defer fake.iterateInterpolatedCredsMutex.RUnlock()
return len(fake.iterateInterpolatedCredsArgsForCall)
}
func (fake *FakeCredVarsTracker) IterateInterpolatedCredsCalls(stub func(vars.CredVarsTrackerIterator)) {
fake.iterateInterpolatedCredsMutex.Lock()
defer fake.iterateInterpolatedCredsMutex.Unlock()
fake.IterateInterpolatedCredsStub = stub
}
func (fake *FakeCredVarsTracker) IterateInterpolatedCredsArgsForCall(i int) vars.CredVarsTrackerIterator {
fake.iterateInterpolatedCredsMutex.RLock()
defer fake.iterateInterpolatedCredsMutex.RUnlock()
argsForCall := fake.iterateInterpolatedCredsArgsForCall[i]
return argsForCall.arg1
}
func (fake *FakeCredVarsTracker) List() ([]vars.VariableDefinition, error) {
fake.listMutex.Lock()
ret, specificReturn := fake.listReturnsOnCall[len(fake.listArgsForCall)]
fake.listArgsForCall = append(fake.listArgsForCall, struct {
}{})
fake.recordInvocation("List", []interface{}{})
fake.listMutex.Unlock()
if fake.ListStub != nil {
return fake.ListStub()
}
if specificReturn {
return ret.result1, ret.result2
}
fakeReturns := fake.listReturns
return fakeReturns.result1, fakeReturns.result2
}
func (fake *FakeCredVarsTracker) ListCallCount() int {
fake.listMutex.RLock()
defer fake.listMutex.RUnlock()
return len(fake.listArgsForCall)
}
func (fake *FakeCredVarsTracker) ListCalls(stub func() ([]vars.VariableDefinition, error)) {
fake.listMutex.Lock()
defer fake.listMutex.Unlock()
fake.ListStub = stub
}
func (fake *FakeCredVarsTracker) ListReturns(result1 []vars.VariableDefinition, result2 error) {
fake.listMutex.Lock()
defer fake.listMutex.Unlock()
fake.ListStub = nil
fake.listReturns = struct {
result1 []vars.VariableDefinition
result2 error
}{result1, result2}
}
func (fake *FakeCredVarsTracker) ListReturnsOnCall(i int, result1 []vars.VariableDefinition, result2 error) {
fake.listMutex.Lock()
defer fake.listMutex.Unlock()
fake.ListStub = nil
if fake.listReturnsOnCall == nil {
fake.listReturnsOnCall = make(map[int]struct {
result1 []vars.VariableDefinition
result2 error
})
}
fake.listReturnsOnCall[i] = struct {
result1 []vars.VariableDefinition
result2 error
}{result1, result2}
}
func (fake *FakeCredVarsTracker) NewLocalScope() vars.CredVarsTracker {
fake.newLocalScopeMutex.Lock()
ret, specificReturn := fake.newLocalScopeReturnsOnCall[len(fake.newLocalScopeArgsForCall)]
fake.newLocalScopeArgsForCall = append(fake.newLocalScopeArgsForCall, struct {
}{})
fake.recordInvocation("NewLocalScope", []interface{}{})
fake.newLocalScopeMutex.Unlock()
if fake.NewLocalScopeStub != nil {
return fake.NewLocalScopeStub()
}
if specificReturn {
return ret.result1
}
fakeReturns := fake.newLocalScopeReturns
return fakeReturns.result1
}
func (fake *FakeCredVarsTracker) NewLocalScopeCallCount() int {
fake.newLocalScopeMutex.RLock()
defer fake.newLocalScopeMutex.RUnlock()
return len(fake.newLocalScopeArgsForCall)
}
func (fake *FakeCredVarsTracker) NewLocalScopeCalls(stub func() vars.CredVarsTracker) {
fake.newLocalScopeMutex.Lock()
defer fake.newLocalScopeMutex.Unlock()
fake.NewLocalScopeStub = stub
}
func (fake *FakeCredVarsTracker) NewLocalScopeReturns(result1 vars.CredVarsTracker) {
fake.newLocalScopeMutex.Lock()
defer fake.newLocalScopeMutex.Unlock()
fake.NewLocalScopeStub = nil
fake.newLocalScopeReturns = struct {
result1 vars.CredVarsTracker
}{result1}
}
func (fake *FakeCredVarsTracker) NewLocalScopeReturnsOnCall(i int, result1 vars.CredVarsTracker) {
fake.newLocalScopeMutex.Lock()
defer fake.newLocalScopeMutex.Unlock()
fake.NewLocalScopeStub = nil
if fake.newLocalScopeReturnsOnCall == nil {
fake.newLocalScopeReturnsOnCall = make(map[int]struct {
result1 vars.CredVarsTracker
})
}
fake.newLocalScopeReturnsOnCall[i] = struct {
result1 vars.CredVarsTracker
}{result1}
}
func (fake *FakeCredVarsTracker) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock()
fake.addLocalVarMutex.RLock()
defer fake.addLocalVarMutex.RUnlock()
fake.enabledMutex.RLock()
defer fake.enabledMutex.RUnlock()
fake.getMutex.RLock()
defer fake.getMutex.RUnlock()
fake.iterateInterpolatedCredsMutex.RLock()
defer fake.iterateInterpolatedCredsMutex.RUnlock()
fake.listMutex.RLock()
defer fake.listMutex.RUnlock()
fake.newLocalScopeMutex.RLock()
defer fake.newLocalScopeMutex.RUnlock()
copiedInvocations := map[string][][]interface{}{}
for key, value := range fake.invocations {
copiedInvocations[key] = value
}
return copiedInvocations
}
func (fake *FakeCredVarsTracker) recordInvocation(key string, args []interface{}) {
fake.invocationsMutex.Lock()
defer fake.invocationsMutex.Unlock()
if fake.invocations == nil {
fake.invocations = map[string][][]interface{}{}
}
if fake.invocations[key] == nil {
fake.invocations[key] = [][]interface{}{}
}
fake.invocations[key] = append(fake.invocations[key], args)
}
var _ vars.CredVarsTracker = new(FakeCredVarsTracker)

View File

@ -0,0 +1,189 @@
// Code generated by counterfeiter. DO NOT EDIT.
package varsfakes
import (
"sync"
"github.com/concourse/concourse/vars"
)
type FakeVariables struct {
GetStub func(vars.VariableDefinition) (interface{}, bool, error)
getMutex sync.RWMutex
getArgsForCall []struct {
arg1 vars.VariableDefinition
}
getReturns struct {
result1 interface{}
result2 bool
result3 error
}
getReturnsOnCall map[int]struct {
result1 interface{}
result2 bool
result3 error
}
ListStub func() ([]vars.VariableDefinition, error)
listMutex sync.RWMutex
listArgsForCall []struct {
}
listReturns struct {
result1 []vars.VariableDefinition
result2 error
}
listReturnsOnCall map[int]struct {
result1 []vars.VariableDefinition
result2 error
}
invocations map[string][][]interface{}
invocationsMutex sync.RWMutex
}
func (fake *FakeVariables) Get(arg1 vars.VariableDefinition) (interface{}, bool, error) {
fake.getMutex.Lock()
ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)]
fake.getArgsForCall = append(fake.getArgsForCall, struct {
arg1 vars.VariableDefinition
}{arg1})
fake.recordInvocation("Get", []interface{}{arg1})
fake.getMutex.Unlock()
if fake.GetStub != nil {
return fake.GetStub(arg1)
}
if specificReturn {
return ret.result1, ret.result2, ret.result3
}
fakeReturns := fake.getReturns
return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3
}
func (fake *FakeVariables) GetCallCount() int {
fake.getMutex.RLock()
defer fake.getMutex.RUnlock()
return len(fake.getArgsForCall)
}
func (fake *FakeVariables) GetCalls(stub func(vars.VariableDefinition) (interface{}, bool, error)) {
fake.getMutex.Lock()
defer fake.getMutex.Unlock()
fake.GetStub = stub
}
func (fake *FakeVariables) GetArgsForCall(i int) vars.VariableDefinition {
fake.getMutex.RLock()
defer fake.getMutex.RUnlock()
argsForCall := fake.getArgsForCall[i]
return argsForCall.arg1
}
func (fake *FakeVariables) GetReturns(result1 interface{}, result2 bool, result3 error) {
fake.getMutex.Lock()
defer fake.getMutex.Unlock()
fake.GetStub = nil
fake.getReturns = struct {
result1 interface{}
result2 bool
result3 error
}{result1, result2, result3}
}
func (fake *FakeVariables) GetReturnsOnCall(i int, result1 interface{}, result2 bool, result3 error) {
fake.getMutex.Lock()
defer fake.getMutex.Unlock()
fake.GetStub = nil
if fake.getReturnsOnCall == nil {
fake.getReturnsOnCall = make(map[int]struct {
result1 interface{}
result2 bool
result3 error
})
}
fake.getReturnsOnCall[i] = struct {
result1 interface{}
result2 bool
result3 error
}{result1, result2, result3}
}
func (fake *FakeVariables) List() ([]vars.VariableDefinition, error) {
fake.listMutex.Lock()
ret, specificReturn := fake.listReturnsOnCall[len(fake.listArgsForCall)]
fake.listArgsForCall = append(fake.listArgsForCall, struct {
}{})
fake.recordInvocation("List", []interface{}{})
fake.listMutex.Unlock()
if fake.ListStub != nil {
return fake.ListStub()
}
if specificReturn {
return ret.result1, ret.result2
}
fakeReturns := fake.listReturns
return fakeReturns.result1, fakeReturns.result2
}
func (fake *FakeVariables) ListCallCount() int {
fake.listMutex.RLock()
defer fake.listMutex.RUnlock()
return len(fake.listArgsForCall)
}
func (fake *FakeVariables) ListCalls(stub func() ([]vars.VariableDefinition, error)) {
fake.listMutex.Lock()
defer fake.listMutex.Unlock()
fake.ListStub = stub
}
func (fake *FakeVariables) ListReturns(result1 []vars.VariableDefinition, result2 error) {
fake.listMutex.Lock()
defer fake.listMutex.Unlock()
fake.ListStub = nil
fake.listReturns = struct {
result1 []vars.VariableDefinition
result2 error
}{result1, result2}
}
func (fake *FakeVariables) ListReturnsOnCall(i int, result1 []vars.VariableDefinition, result2 error) {
fake.listMutex.Lock()
defer fake.listMutex.Unlock()
fake.ListStub = nil
if fake.listReturnsOnCall == nil {
fake.listReturnsOnCall = make(map[int]struct {
result1 []vars.VariableDefinition
result2 error
})
}
fake.listReturnsOnCall[i] = struct {
result1 []vars.VariableDefinition
result2 error
}{result1, result2}
}
func (fake *FakeVariables) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock()
fake.getMutex.RLock()
defer fake.getMutex.RUnlock()
fake.listMutex.RLock()
defer fake.listMutex.RUnlock()
copiedInvocations := map[string][][]interface{}{}
for key, value := range fake.invocations {
copiedInvocations[key] = value
}
return copiedInvocations
}
func (fake *FakeVariables) recordInvocation(key string, args []interface{}) {
fake.invocationsMutex.Lock()
defer fake.invocationsMutex.Unlock()
if fake.invocations == nil {
fake.invocations = map[string][][]interface{}{}
}
if fake.invocations[key] == nil {
fake.invocations[key] = [][]interface{}{}
}
fake.invocations[key] = append(fake.invocations[key], args)
}
var _ vars.Variables = new(FakeVariables)