| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548 |
- package config
- import (
- "fmt"
- "os"
- "path/filepath"
- "testing"
- cloudconfig "github.com/opencost/opencost/pkg/cloud"
- "github.com/opencost/opencost/pkg/cloud/aws"
- "github.com/opencost/opencost/pkg/cloud/gcp"
- )
- var configFile = "test.json"
- // Baseline valid config
- var validAthenaConf = &aws.AthenaConfiguration{
- Bucket: "bucket",
- Region: "region",
- Database: "database",
- Table: "table",
- Workgroup: "workgroup",
- Account: "account",
- Authorizer: &aws.ServiceAccount{},
- }
- // Config with the same key as the baseline but is not equal to it because of the change in the non-keyed property Workgroup
- var validAthenaConfModifiedProperty = &aws.AthenaConfiguration{
- Bucket: "bucket",
- Region: "region",
- Database: "database",
- Table: "table",
- Workgroup: "workgroup1",
- Account: "account",
- Authorizer: &aws.ServiceAccount{},
- }
- // Config with the same key as baseline but is invalid due to missing Authorizer
- var invalidAthenaConf = &aws.AthenaConfiguration{
- Bucket: "bucket",
- Region: "region",
- Database: "database",
- Table: "table",
- Workgroup: "workgroup",
- Account: "account",
- Authorizer: nil,
- }
- // A valid config with a different key from the baseline
- var validBigQueryConf = &gcp.BigQueryConfiguration{
- ProjectID: "projectID",
- Dataset: "dataset",
- Table: "table",
- Authorizer: &gcp.WorkloadIdentity{},
- }
- func TestIntegrationController_pullWatchers(t *testing.T) {
- testCases := map[string]struct {
- initialStatuses []*Status
- configWatchers map[ConfigSource]cloudconfig.KeyedConfigWatcher
- expectedStatuses []*Status
- }{
- // Helm Source
- "Helm Source init": {
- initialStatuses: []*Status{},
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Helm Source No Change": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Helm Source Update Config": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConfModifiedProperty.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConfModifiedProperty,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Helm Source Update Config Invalid": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- invalidAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: invalidAthenaConf.Key(),
- Active: false,
- Valid: false,
- ConfigType: AthenaConfigType,
- Config: invalidAthenaConf,
- },
- },
- },
- "Helm Source New Config": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validBigQueryConf,
- },
- },
- },
- // Config File
- "Config File Source init": {
- initialStatuses: []*Status{},
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Config File No Change": {
- initialStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Config File Update Config": {
- initialStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Config File Update Config Invalid": {
- initialStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- invalidAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: invalidAthenaConf.Key(),
- Active: false,
- Valid: false,
- ConfigType: AthenaConfigType,
- Config: invalidAthenaConf,
- },
- },
- },
- "Config File New Config": {
- initialStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- },
- // Multi Cloud
- "Multi Cloud Source init": {
- initialStatuses: []*Status{},
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- MultiCloudSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Multi Cloud No Change": {
- initialStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- MultiCloudSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- },
- "Multi Cloud Update Config": {
- initialStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- MultiCloudSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConfModifiedProperty,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConfModifiedProperty.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConfModifiedProperty,
- },
- },
- },
- "Multi Cloud Update Config Invalid": {
- initialStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- MultiCloudSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- invalidAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: invalidAthenaConf.Key(),
- Active: false,
- Valid: false,
- ConfigType: AthenaConfigType,
- Config: invalidAthenaConf,
- },
- },
- },
- "Multi Cloud New Config": {
- initialStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- MultiCloudSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- },
- "Multi Cloud Delete All": {
- initialStatuses: []*Status{
- {
- Source: MultiCloudSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- MultiCloudSource: &MockKeyedConfigWatcher{},
- },
- expectedStatuses: []*Status{},
- },
- // Watch Interaction
- "New Helm, Existing Config File": {
- initialStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: false,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- {
- Source: HelmSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- },
- "Update Helm, Existing Config File": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: false,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConfModifiedProperty,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConfModifiedProperty.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConfModifiedProperty,
- },
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: false,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- },
- "New Helm Invalid, Existing Config File": {
- initialStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- invalidAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- {
- Source: HelmSource,
- Key: invalidAthenaConf.Key(),
- Active: false,
- Valid: false,
- ConfigType: AthenaConfigType,
- Config: invalidAthenaConf,
- },
- },
- },
- "Update Helm Invalid, Existing Config File": {
- initialStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: false,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- invalidAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- {
- Source: HelmSource,
- Key: invalidAthenaConf.Key(),
- Active: false,
- Valid: false,
- ConfigType: AthenaConfigType,
- Config: invalidAthenaConf,
- },
- },
- },
- "New Config File, Existing Helm": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConf,
- },
- },
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validAthenaConf.Key(),
- Active: false,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- {
- Source: ConfigFileSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- },
- "Update Config File, Existing Helm": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{},
- },
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validAthenaConfModifiedProperty,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: ConfigFileSource,
- Key: validAthenaConfModifiedProperty.Key(),
- Active: true,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConfModifiedProperty,
- },
- },
- },
- "New Config File Invalid, Existing Helm": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- invalidAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- {
- Source: ConfigFileSource,
- Key: invalidAthenaConf.Key(),
- Active: false,
- Valid: false,
- ConfigType: AthenaConfigType,
- Config: invalidAthenaConf,
- },
- },
- },
- "Update Config File Invalid, Existing Helm": {
- initialStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- {
- Source: ConfigFileSource,
- Key: validAthenaConf.Key(),
- Active: false,
- Valid: true,
- ConfigType: AthenaConfigType,
- Config: validAthenaConf,
- },
- },
- configWatchers: map[ConfigSource]cloudconfig.KeyedConfigWatcher{
- HelmSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- validBigQueryConf,
- },
- },
- ConfigFileSource: &MockKeyedConfigWatcher{
- Integrations: []cloudconfig.KeyedConfig{
- invalidAthenaConf,
- },
- },
- },
- expectedStatuses: []*Status{
- {
- Source: HelmSource,
- Key: validBigQueryConf.Key(),
- Active: true,
- Valid: true,
- ConfigType: BigQueryConfigType,
- Config: validBigQueryConf,
- },
- {
- Source: ConfigFileSource,
- Key: invalidAthenaConf.Key(),
- Active: false,
- Valid: false,
- ConfigType: AthenaConfigType,
- Config: invalidAthenaConf,
- },
- },
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(t *testing.T) {
- // Test set up and validation
- initialStatuses, err := buildStatuses(tc.initialStatuses)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- expectedStatuses, err := buildStatuses(tc.expectedStatuses)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- tempDir := os.TempDir()
- path := filepath.Join(tempDir, configFile)
- defer os.Remove(path)
- storage := &FileControllerStorage{
- path: path,
- }
- // Initialize controller
- icd := &Controller{
- storage: storage,
- watchers: tc.configWatchers,
- }
- err = icd.storage.save(initialStatuses)
- if err != nil {
- t.Errorf("failed to save initial statuses: %s", err.Error())
- }
- // Functionality being tested
- icd.pullWatchers()
- // Test Result
- status, err := icd.storage.load()
- if err != nil {
- t.Errorf("failed to load status file: %s", err.Error())
- }
- err = checkStatuses(status, expectedStatuses)
- if err != nil {
- t.Errorf("statuses equality check failed: %s", err.Error())
- }
- })
- }
- }
- func TestIntegrationController_CreateConfig(t *testing.T) {
- testCases := map[string]struct {
- initial []*Status
- expected []*Status
- input cloudconfig.KeyedConfig
- expectErr bool
- }{
- "Invalid Config": {
- initial: nil,
- expected: nil,
- input: invalidAthenaConf,
- expectErr: true,
- },
- "config exists from this source": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- input: validAthenaConf,
- expectErr: true,
- },
- "config exists from this source altered": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- input: validAthenaConfModifiedProperty,
- expectErr: true,
- },
- "config exists from other source enabled": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- input: validAthenaConf,
- expectErr: false,
- },
- "config exists from other source disabled": {
- initial: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- input: validAthenaConf,
- expectErr: false,
- },
- "config into empty": {
- initial: []*Status{},
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- input: validAthenaConf,
- expectErr: false,
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(t *testing.T) {
- // Test set up and validation
- initialStatuses, err := buildStatuses(tc.initial)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- expectedStatuses, err := buildStatuses(tc.expected)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- tempDir := os.TempDir()
- path := filepath.Join(tempDir, configFile)
- defer os.Remove(path)
- storage := &FileControllerStorage{
- path: path,
- }
- // Initialize controller
- icd := &Controller{
- storage: storage,
- }
- err = icd.storage.save(initialStatuses)
- if err != nil {
- t.Errorf("failed to save initial statuses: %s", err.Error())
- }
- // Functionality being tested
- err = icd.CreateConfig(tc.input)
- // Test Result
- if err != nil && !tc.expectErr {
- t.Errorf("unexpected error when creating config: %s", err.Error())
- }
- if err == nil && tc.expectErr {
- t.Errorf("no error where expect")
- }
- status, err := icd.storage.load()
- if err != nil {
- t.Errorf("failed to load status file: %s", err.Error())
- }
- err = checkStatuses(status, expectedStatuses)
- if err != nil {
- t.Errorf("statuses equality check failed: %s", err.Error())
- }
- })
- }
- }
- func TestIntegrationController_UpdateConfig(t *testing.T) {
- testCases := map[string]struct {
- initial []*Status
- expected []*Status
- input cloudconfig.KeyedConfig
- expectErr bool
- }{
- "invalid config": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- input: invalidAthenaConf,
- expectErr: true,
- },
- "config is not from ConfigControllerSource": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- input: validAthenaConf,
- expectErr: true,
- },
- "config does not exist": {
- initial: []*Status{},
- expected: []*Status{},
- input: validAthenaConf,
- expectErr: true,
- },
- "update existing config with modified properties": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConfModifiedProperty, true, ConfigControllerSource),
- },
- input: validAthenaConfModifiedProperty,
- expectErr: false,
- },
- "update existing config with same properties": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- input: validAthenaConf,
- expectErr: false,
- },
- "update existing config when other source has same key": {
- initial: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- makeStatus(validAthenaConfModifiedProperty, true, ConfigControllerSource),
- },
- input: validAthenaConfModifiedProperty,
- expectErr: false,
- },
- "update existing config when multiple other configs exist": {
- initial: []*Status{
- makeStatus(validBigQueryConf, true, MultiCloudSource),
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validBigQueryConf, true, MultiCloudSource),
- makeStatus(validAthenaConfModifiedProperty, true, ConfigControllerSource),
- },
- input: validAthenaConfModifiedProperty,
- expectErr: false,
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(t *testing.T) {
- // Test set up and validation
- initialStatuses, err := buildStatuses(tc.initial)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- expectedStatuses, err := buildStatuses(tc.expected)
- if err != nil {
- t.Errorf("expected statuses: %s", err.Error())
- }
- tempDir := os.TempDir()
- path := filepath.Join(tempDir, configFile)
- defer os.Remove(path)
- storage := &FileControllerStorage{
- path: path,
- }
- // Initialize controller
- icd := &Controller{
- storage: storage,
- }
- err = icd.storage.save(initialStatuses)
- if err != nil {
- t.Errorf("failed to save initial statuses: %s", err.Error())
- }
- // Functionality being tested
- err = icd.UpdateConfig(tc.input)
- // Test Result
- if err != nil && !tc.expectErr {
- t.Errorf("unexpected error when updating config: %s", err.Error())
- }
- if err == nil && tc.expectErr {
- t.Errorf("no error where expected")
- }
- status, err := icd.storage.load()
- if err != nil {
- t.Errorf("failed to load status file: %s", err.Error())
- }
- err = checkStatuses(status, expectedStatuses)
- if err != nil {
- t.Errorf("statuses equality check failed: %s", err.Error())
- }
- })
- }
- }
- func TestIntegrationController_EnableConfig(t *testing.T) {
- testCases := map[string]struct {
- initial []*Status
- expected []*Status
- inputKey string
- inputSource string
- expectErr bool
- }{
- "config doesn't exist": {
- initial: []*Status{},
- expected: []*Status{},
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: true,
- },
- "config is already enabled": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: true,
- },
- "alternate source": {
- initial: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: MultiCloudSource.String(),
- expectErr: false,
- },
- "enabled disabled single config": {
- initial: []*Status{
- makeStatus(validAthenaConf, false, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: false,
- },
- "enable config which is enabled by another source": {
- initial: []*Status{
- makeStatus(validAthenaConf, false, ConfigControllerSource),
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: false,
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(t *testing.T) {
- // Test set up and validation
- initialStatuses, err := buildStatuses(tc.initial)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- expectedStatuses, err := buildStatuses(tc.expected)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- tempDir := os.TempDir()
- path := filepath.Join(tempDir, configFile)
- defer os.Remove(path)
- storage := &FileControllerStorage{
- path: path,
- }
- // Initialize controller
- icd := &Controller{
- storage: storage,
- }
- err = icd.storage.save(initialStatuses)
- if err != nil {
- t.Errorf("failed to save initial statuses: %s", err.Error())
- }
- // Functionality being tested
- err = icd.EnableConfig(tc.inputKey, tc.inputSource)
- // Test Result
- if err != nil && !tc.expectErr {
- t.Errorf("unexpected error when enabling config: %s", err.Error())
- }
- if err == nil && tc.expectErr {
- t.Errorf("no error where expect")
- }
- status, err := icd.storage.load()
- if err != nil {
- t.Errorf("failed to load status file: %s", err.Error())
- }
- err = checkStatuses(status, expectedStatuses)
- if err != nil {
- t.Errorf("statuses equality check failed: %s", err.Error())
- }
- })
- }
- }
- func TestIntegrationController_DisableConfig(t *testing.T) {
- testCases := map[string]struct {
- initial []*Status
- expected []*Status
- inputKey string
- inputSource string
- expectErr bool
- }{
- "config doesn't exist": {
- initial: []*Status{},
- expected: []*Status{},
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: true,
- },
- "config is already disabled": {
- initial: []*Status{
- makeStatus(validAthenaConf, false, ConfigControllerSource),
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, ConfigControllerSource),
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: true,
- },
- "disable single config": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, ConfigControllerSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: false,
- },
- "alternate source": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: MultiCloudSource.String(),
- expectErr: false,
- },
- "disable config, matching config from separate source": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, ConfigControllerSource),
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: false,
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(t *testing.T) {
- // Test set up and validation
- initialStatuses, err := buildStatuses(tc.initial)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- expectedStatuses, err := buildStatuses(tc.expected)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- tempDir := os.TempDir()
- path := filepath.Join(tempDir, configFile)
- defer os.Remove(path)
- storage := &FileControllerStorage{
- path: path,
- }
- // Initialize controller
- icd := &Controller{
- storage: storage,
- }
- err = icd.storage.save(initialStatuses)
- if err != nil {
- t.Errorf("failed to save initial statuses: %s", err.Error())
- }
- // Functionality being tested
- err = icd.DisableConfig(tc.inputKey, tc.inputSource)
- // Test Result
- if err != nil && !tc.expectErr {
- t.Errorf("unexpected error when disabling config: %s", err.Error())
- }
- if err == nil && tc.expectErr {
- t.Errorf("no error where expect")
- }
- status, err := icd.storage.load()
- if err != nil {
- t.Errorf("failed to load status file: %s", err.Error())
- }
- err = checkStatuses(status, expectedStatuses)
- if err != nil {
- t.Errorf("statuses equality check failed: %s", err.Error())
- }
- })
- }
- }
- func TestIntegrationController_DeleteConfig(t *testing.T) {
- testCases := map[string]struct {
- initial []*Status
- expected []*Status
- inputKey string
- inputSource string
- expectErr bool
- }{
- "config doesn't exist": {
- initial: []*Status{},
- expected: []*Status{},
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: true,
- },
- "invalid source": {
- initial: []*Status{},
- expected: []*Status{},
- inputKey: validAthenaConf.Key(),
- inputSource: MultiCloudSource.String(),
- expectErr: true,
- },
- "delete single config": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- },
- expected: []*Status{},
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: false,
- },
- "disable config, matching config from separate source": {
- initial: []*Status{
- makeStatus(validAthenaConf, true, ConfigControllerSource),
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- expected: []*Status{
- makeStatus(validAthenaConf, false, MultiCloudSource),
- },
- inputKey: validAthenaConf.Key(),
- inputSource: ConfigControllerSource.String(),
- expectErr: false,
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(t *testing.T) {
- // Test set up and validation
- initialStatuses, err := buildStatuses(tc.initial)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- expectedStatuses, err := buildStatuses(tc.expected)
- if err != nil {
- t.Errorf("initial statuses: %s", err.Error())
- }
- tempDir := os.TempDir()
- path := filepath.Join(tempDir, configFile)
- defer os.Remove(path)
- storage := &FileControllerStorage{
- path: path,
- }
- // Initialize controller
- icd := &Controller{
- storage: storage,
- }
- err = icd.storage.save(initialStatuses)
- if err != nil {
- t.Errorf("failed to save initial statuses: %s", err.Error())
- }
- // Functionality being tested
- err = icd.DeleteConfig(tc.inputKey, tc.inputSource)
- // Test Result
- if err != nil && !tc.expectErr {
- t.Errorf("unexpected error when deleting config: %s", err.Error())
- }
- if err == nil && tc.expectErr {
- t.Errorf("no error where expect")
- }
- status, err := icd.storage.load()
- if err != nil {
- t.Errorf("failed to load status file: %s", err.Error())
- }
- err = checkStatuses(status, expectedStatuses)
- if err != nil {
- t.Errorf("statuses equality check failed: %s", err.Error())
- }
- })
- }
- }
- func makeStatus(config cloudconfig.KeyedConfig, active bool, source ConfigSource) *Status {
- err := config.Validate()
- valid := err == nil
- configType, err := ConfigTypeFromConfig(config)
- if err != nil {
- panic(fmt.Errorf("config type not recognised: %w", err))
- }
- return &Status{
- Source: source,
- Key: config.Key(),
- Active: active,
- Valid: valid,
- ConfigType: configType,
- Config: config,
- }
- }
- func buildStatuses(statusList []*Status) (Statuses, error) {
- statuses := Statuses{}
- for _, status := range statusList {
- if _, ok := statuses.Get(status.Key, status.Source); ok {
- return nil, fmt.Errorf("invalid test, duplicate status with key: %s source: %s", status.Key, status.Source.String())
- }
- statuses.Insert(status)
- }
- return statuses, nil
- }
- func checkStatuses(actual, expected Statuses) error {
- if len(actual.List()) != len(expected.List()) {
- return fmt.Errorf("integration statueses did not have the correct length actaul: %d, expected: %d", len(actual.List()), len(expected.List()))
- }
- for _, actualStatus := range actual.List() {
- expectedStatus, ok := expected.Get(actualStatus.Key, actualStatus.Source)
- if !ok {
- return fmt.Errorf("expected integration statuses is missing with integration key: %s, source: %s", actualStatus.Key, actualStatus.Source.String())
- }
- // failure here indicates an issue with the configID
- if actualStatus.Key != expectedStatus.Key {
- return fmt.Errorf("integration status does not have the correct Key values actual: %s, expected: %s", actualStatus.Key, expectedStatus.Key)
- }
- // failure here indicates an issue with the configID
- if actualStatus.Key != expectedStatus.Key {
- return fmt.Errorf("integration status does not have the correct Source values actual: %s, expected: %s", actualStatus.Source, expectedStatus.Source)
- }
- if actualStatus.Active != expectedStatus.Active {
- return fmt.Errorf("integration status does not have the correct Active values actual: %v, expected: %v", actualStatus.Active, expectedStatus.Active)
- }
- if actualStatus.Valid != expectedStatus.Valid {
- return fmt.Errorf("integration status does not have the correct Valid values actual: %v, expected: %v", actualStatus.Valid, expectedStatus.Valid)
- }
- if !actualStatus.Config.Equals(expectedStatus.Config) {
- return fmt.Errorf("integration status does not have the correct config values actual: %v, expected: %v", actualStatus.Config, expectedStatus.Config)
- }
- }
- return nil
- }
|