Skip to content

Instantly share code, notes, and snippets.

@jkschneider
Last active November 8, 2018 06:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jkschneider/8b0e28bcc81081ce0464514d53d497ac to your computer and use it in GitHub Desktop.
Save jkschneider/8b0e28bcc81081ce0464514d53d497ac to your computer and use it in GitHub Desktop.
{"name":"tests","children":[{"name":"clouddriver-google-common","children":[{"name":"com.netflix.spinnaker.clouddriver.googlecommon.deploy.GoogleCommonSafeRetrySpec","children":[{"name":"should retry on certain error codes[0]","size":727},{"name":"should retry on certain error codes[1]","size":0},{"name":"should retry on certain error codes[2]","size":1},{"name":"should retry on certain error codes[3]","size":1},{"name":"should retry on certain error codes[4]","size":1},{"name":"no_retry","size":1094},{"name":"retry_until_success","size":257},{"name":"retry_until_exhausted","size":22},{"name":"retry_until_404_ok","size":10},{"name":"retry_until_404_not_ok","size":7}]}]},{"name":"clouddriver-security","children":[{"name":"com.netflix.spinnaker.clouddriver.security.DefaultAccountCredentialsProviderSpec","children":[{"name":"should call repo to retrieve objects","size":772}]},{"name":"com.netflix.spinnaker.clouddriver.security.DefaultAllowedAccountsValidatorSpec","children":[{"name":"should reject if allowed accounts does not intersect with required group memberships[0]","size":533},{"name":"should reject if allowed accounts does not intersect with required group memberships[1]","size":7},{"name":"should reject if allowed accounts does not intersect with required group memberships[2]","size":6},{"name":"should reject if allowed accounts does not intersect with required group memberships[3]","size":3},{"name":"should reject if allowed accounts does not intersect with required group memberships[4]","size":2},{"name":"should allow if allow accounts intersect with required group memberships","size":6},{"name":"should allow if all accounts intersection with required group memberships[0]","size":208},{"name":"should allow if all accounts intersection with required group memberships[1]","size":2},{"name":"should allow if all accounts intersection with required group memberships[2]","size":4},{"name":"should allow if no required group memberships","size":1},{"name":"should allow if description is non-credentialed","size":14},{"name":"should reject if no credentials in description","size":166},{"name":"should short circuit if fiat is enabled","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.security.ProviderUtilsSpec","children":[{"name":"should collect account names from all account aware agents","size":15},{"name":"should collect accounts matching specified credentials type[0]","size":137},{"name":"should collect accounts matching specified credentials type[1]","size":1},{"name":"should reschedule specified agents","size":230},{"name":"should calculate account deltas for specified credentials type[0]","size":62},{"name":"should calculate account deltas for specified credentials type[1]","size":2},{"name":"should unschedule and deregister agents associated with deleted accounts","size":64}]}]},{"name":"cats-core","children":[{"name":"com.netflix.spinnaker.cats.cache.CompositeCacheSpec","children":[{"name":"empty cache behaviour","size":677},{"name":"existing value behaviour","size":71},{"name":"identifiers behaviour","size":7},{"name":"filterIdentifiers behaviour","size":95},{"name":"a cached value does not exist until it has attributes","size":5},{"name":"can getAll empty id collection","size":3},{"name":"get by id behaviour","size":19},{"name":"relationship filtering behaviour[0]","size":196},{"name":"relationship filtering behaviour[1]","size":1},{"name":"relationship filtering behaviour[2]","size":1},{"name":"relationship filtering behaviour[3]","size":2},{"name":"attributes are merged from both caches","size":4}]},{"name":"com.netflix.spinnaker.cats.cache.DefaultCacheDataSpec","children":[{"name":"should set cacheExpiry attribute based on ttlSeconds","size":119},{"name":"should set ttlSeconds attribute based on cacheExpiry","size":1}]},{"name":"com.netflix.spinnaker.cats.provider.DefaultProviderCacheSpec","children":[{"name":"empty cache behaviour","size":13},{"name":"existing value behaviour","size":7},{"name":"identifiers behaviour","size":1},{"name":"filterIdentifiers behaviour","size":10},{"name":"a cached value does not exist until it has attributes","size":2},{"name":"can getAll empty id collection","size":1},{"name":"get by id behaviour","size":1},{"name":"relationship filtering behaviour[0]","size":4},{"name":"relationship filtering behaviour[1]","size":2},{"name":"relationship filtering behaviour[2]","size":1},{"name":"relationship filtering behaviour[3]","size":2},{"name":"explicit evictions are removed from the cache","size":1},{"name":"multiple agents can cache the same data type","size":13},{"name":"an agents deletions don't affect another agent","size":3},{"name":"items can be evicted by type and id","size":2}]},{"name":"com.netflix.spinnaker.cats.agent.CompositeExecutionInstrumentationSpec","children":[{"name":"calls all instrumentations","size":150}]},{"name":"com.netflix.spinnaker.cats.agent.CacheExecutionSpec","children":[{"name":"should evict keys that were NOT cached by the responsible agent","size":163},{"name":"should skip stale keys check if agent supplies no cache key patterns","size":7}]},{"name":"com.netflix.spinnaker.cats.agent.DefaultAgentSchedulerSpec","children":[{"name":"executionInstrumentation is informed of agent execution","size":179},{"name":"executionInstrumentation is informed of agent failure","size":5}]},{"name":"com.netflix.spinnaker.cats.agent.AgentControllerSpec","children":[{"name":"should schedule all agents in all providers","size":26},{"name":"should store cache result with correct authoritative","size":241}]},{"name":"com.netflix.spinnaker.cats.compression.GZipCompressionStrategySpec","children":[{"name":"should compress and decompress values","size":6}]},{"name":"com.netflix.spinnaker.cats.mem.InMemoryCacheSpec","children":[{"name":"empty cache behaviour","size":1},{"name":"existing value behaviour","size":2},{"name":"identifiers behaviour","size":0},{"name":"filterIdentifiers behaviour","size":5},{"name":"a cached value does not exist until it has attributes","size":2},{"name":"can getAll empty id collection","size":1},{"name":"get by id behaviour","size":1},{"name":"relationship filtering behaviour[0]","size":4},{"name":"relationship filtering behaviour[1]","size":1},{"name":"relationship filtering behaviour[2]","size":1},{"name":"relationship filtering behaviour[3]","size":1},{"name":"merge creates a new value","size":1},{"name":"merge stores relationships","size":1},{"name":"merge replaces all attributes","size":3},{"name":"can evictAll empty collection","size":3},{"name":"can mergeAll empty collection","size":0},{"name":"merging null attributes removes the value","size":1},{"name":"mergeAll with empty collection","size":0},{"name":"mergeAll merges all items","size":3},{"name":"evict removes the item","size":1},{"name":"evict ignores non-existing items","size":0},{"name":"evictAll removes all present items","size":11}]},{"name":"com.netflix.spinnaker.cats.mem.GlobSpec","children":[{"name":"fixed string: foo matches foo","size":7},{"name":"fixed string: foo does not match foot","size":0},{"name":"fixed string: foo does not match afoo","size":0},{"name":"fixed string: foo does not match foofoo","size":0},{"name":"wildcard char: f?o matches foo","size":0},{"name":"wildcard char: f?o does not match foot","size":0},{"name":"wildcard char: f?? matches fii","size":0},{"name":"wildcard char: f?? matches fio","size":0},{"name":"wildcard char: ?f? matches ofo","size":1},{"name":"wildcard char: ??? does not match fi","size":2},{"name":"wildcard string: fo* matches fo","size":2},{"name":"wildcard string: fo* matches foo","size":1},{"name":"wildcard string: fo* matches fooooo","size":1},{"name":"wildcard string: *oof matches foof","size":1},{"name":"wildcard string: *oof matches whoof","size":0},{"name":"wildcard string: f*f matches ff","size":1},{"name":"wildcard string: f*f matches fof","size":1},{"name":"wildcard string: f*f matches fff","size":0},{"name":"wildcard string: f*f matches fofofofof","size":0},{"name":"wildcard string: f*f does not match fooofa","size":1},{"name":"wildcard string: f*f* matches fifa","size":0},{"name":"escaping: fo\\* matches fo*","size":0},{"name":"escaping: fo\\* does not match fot","size":0},{"name":"escaping: fo\\? matches fo?","size":1},{"name":"escaping: fo\\? does not match foo","size":0},{"name":"char groups: f[aeo]o matches fao","size":0},{"name":"char groups: f[aeo]o matches feo","size":1},{"name":"char groups: f[aeo]o matches foo","size":0},{"name":"char groups: f[aeo]o does not match fuo","size":0},{"name":"char groups: f[\\*o]o matches f*o","size":0},{"name":"char groups: f[\\*o]o matches foo","size":0},{"name":"char groups: f[\\*o]o does not match f\\o","size":0},{"name":"char groups: f[ri]o[di] matches frod","size":0},{"name":"char groups: f[ri]o[di] matches fiod","size":0},{"name":"char groups: f[ri]o[di] matches froi","size":0},{"name":"char groups: f[ri]o[di] matches fioi","size":0},{"name":"combined: *ba?one[yi] pon[yi\\?] matches balonei pon?","size":1},{"name":"combined: *ba?one[yi] pon[yi\\?] matches baloney poni","size":0},{"name":"combined: *ba?one[yi] pon[yi\\?] matches balonei pony","size":0},{"name":"combined: \\*ba?one[\\\\yi] \\pon[yi\\?] matches *barone\\ pon?","size":1},{"name":"combined: \\*ba?one[\\\\yi] \\pon[yi\\?] does not match *barone\\ pon?","size":1},{"name":"combined: \\dontcare[\\]\\ matches dontcare[]","size":0},{"name":"combined: \\dontcare[\\]\\ does not match dontcare[","size":0},{"name":"combined: dontcare[\\ matches dontcare[","size":0},{"name":"combined: dontcare\\ matches dontcare","size":0}]},{"name":"com.netflix.spinnaker.cats.mem.InMemoryNamedCacheFactorySpec","children":[{"name":"unique cache returned per key","size":4},{"name":"same cache returned for same key","size":0}]},{"name":"com.netflix.spinnaker.cats.CatsSpec","children":[{"name":"it should initially have no results","size":57},{"name":"app not created by sg agent","size":2},{"name":"app referenced by sg agent removed by app agent","size":5}]}]},{"name":"cats-redis","children":[{"name":"com.netflix.spinnaker.cats.redis.cluster.ClusteredAgentSchedulerSpec","children":[{"name":"cache run aborted if agent doesnt acquire execution token","size":2472},{"name":"cache run proceeds if agent acquires execution token","size":93},{"name":"execution token is TTLd when agent execution fails","size":97}]},{"name":"com.netflix.spinnaker.cats.redis.cluster.DefaultNodeIdentitySpec","children":[{"name":"should resolve to valid network interface","size":21},{"name":"should refresh when unknown host","size":219}]},{"name":"com.netflix.spinnaker.cats.redis.cache.RedisNamedCacheFactorySpec","children":[{"name":"caches with the same name share content","size":752},{"name":"caches with different names do not share content","size":57}]},{"name":"com.netflix.spinnaker.cats.redis.cache.RedisCacheSpec","children":[{"name":"empty cache behaviour","size":59},{"name":"existing value behaviour","size":9},{"name":"identifiers behaviour","size":9},{"name":"filterIdentifiers behaviour","size":40},{"name":"a cached value does not exist until it has attributes","size":5},{"name":"can getAll empty id collection","size":2},{"name":"get by id behaviour","size":12},{"name":"relationship filtering behaviour[0]","size":19},{"name":"relationship filtering behaviour[1]","size":10},{"name":"relationship filtering behaviour[2]","size":9},{"name":"relationship filtering behaviour[3]","size":10},{"name":"merge creates a new value","size":9},{"name":"merge stores relationships","size":7},{"name":"merge replaces all attributes","size":7},{"name":"can evictAll empty collection","size":3},{"name":"can mergeAll empty collection","size":2},{"name":"merging null attributes removes the value","size":6},{"name":"mergeAll with empty collection","size":1},{"name":"mergeAll merges all items","size":11},{"name":"evict removes the item","size":8},{"name":"evict ignores non-existing items","size":2},{"name":"evictAll removes all present items","size":30},{"name":"attribute datatype handling null","size":5},{"name":"attribute datatype handling Integer","size":22},{"name":"attribute datatype handling Float","size":8},{"name":"attribute datatype handling String","size":3},{"name":"attribute datatype handling Boolean","size":4},{"name":"attribute datatype handling Primitive list","size":4},{"name":"attribute datatype handling Map","size":6},{"name":"attribute datatype handling Java object","size":19},{"name":"attribute datatype handling Map with null","size":3},{"name":"attribute datatype handling Java object with null","size":4},{"name":"cache data will expire if ttl specified[0]","size":1513},{"name":"cache data will expire if ttl specified[1]","size":1509},{"name":"verify MSET chunking behavior (> MAX_MSET_SIZE)","size":4},{"name":"should fail if maxMsetSize is not even","size":1},{"name":"should ignore hashes if hashes disabled","size":10},{"name":"should not write an item if it is unchanged","size":3},{"name":"should merge #mergeCount items at a time","size":192}]}]},{"name":"clouddriver-docker","children":[{"name":"com.netflix.spinnaker.clouddriver.docker.registry.api.v2.auth.DockerBearerTokenServiceSpec","children":[{"name":"should parse Www-Authenticate header with full privileges and path.","size":246},{"name":"should parse Www-Authenticate header with some privileges and path.","size":1},{"name":"should parse Www-Authenticate header with some privileges and no path.","size":1},{"name":"should parse unquoted Www-Authenticate header with some privileges and path.","size":1},{"name":"should request a real token from Dockerhub's token registry.","size":2445},{"name":"should request a real token from Dockerhub's token registry, and supply a cached one.","size":127},{"name":"should read a password from a file, and correctly prepare the basic auth string.","size":34},{"name":"should run a command to get password, and correctly prepare the basic auth string.","size":165}]},{"name":"com.netflix.spinnaker.clouddriver.docker.registry.controllers.DockerRegistryImageLookupControllerSpec","children":[{"name":"GenerateArtifact","size":16}]}]},{"name":"clouddriver-core","children":[{"name":"com.netflix.spinnaker.clouddriver.data.task.InMemoryTaskRepositoryTest","children":[{"name":"testListRunningTasks","size":1915},{"name":"testClientRequestIdLookup","size":8},{"name":"testResultObjectOrderingIsPreserved","size":145},{"name":"testTaskPersistence","size":1},{"name":"testResultObjectsPersistence","size":3},{"name":"testFailureStatus","size":3},{"name":"testTaskLookup","size":4},{"name":"testTaskHistoryPersistence","size":237}]},{"name":"com.netflix.spinnaker.clouddriver.data.task.jedis.RedisTaskRepositoryTest","children":[{"name":"testListRunningTasks","size":2130},{"name":"testClientRequestIdLookup","size":192},{"name":"testResultObjectOrderingIsPreserved","size":183},{"name":"testTaskPersistence","size":194},{"name":"testResultObjectsPersistence","size":183},{"name":"testFailureStatus","size":189},{"name":"testTaskLookup","size":179},{"name":"testTaskHistoryPersistence","size":188}]},{"name":"com.netflix.spinnaker.clouddriver.core.ProjectClustersServiceSpec","children":[{"name":"returns an empty list without trying to retrieve applications when no clusters are configured","size":499},{"name":"builds the very specific model we probably want for the project dashboard","size":365},{"name":"includes all applications if none specified for a cluster","size":18},{"name":"only returns specified applications if declared in cluster config","size":92},{"name":"includes all clusters on stack wildcard","size":18},{"name":"excludes disabled server groups","size":11},{"name":"includes exactly matched clusters","size":7},{"name":"includes all builds per region with latest deployment date, ignoring disabled server groups","size":139}]},{"name":"com.netflix.spinnaker.clouddriver.core.limits.ServiceLimitConfigurationSpec","children":[{"name":"should accept all null filters","size":43},{"name":"should override values","size":63}]},{"name":"com.netflix.spinnaker.clouddriver.core.agent.CleanupPendingOnDemandCachesAgentSpec","children":[{"name":"should cleanup onDemand:members set for a provider","size":273}]},{"name":"com.netflix.spinnaker.clouddriver.cache.CatsSearchProviderSpec","children":[{"name":"should parse instance identifiers","size":263},{"name":"should handle unparseable instance identifiers","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.deploy.DescriptionAuthorizerSpec","children":[{"name":"should authorize passed description","size":477}]},{"name":"com.netflix.spinnaker.clouddriver.deploy.DeployAtomicOperationUnitSpec","children":[{"name":"deploy handler is retrieved from registry","size":198},{"name":"exception is thrown when handler does not exist in registry","size":18}]},{"name":"com.netflix.spinnaker.clouddriver.orchestration.DefaultOrchestrationProcessorSpec","children":[{"name":"complete the task when everything goes as planned","size":297},{"name":"fail the task when exception is thrown","size":19},{"name":"failure should be logged in the result objects","size":13},{"name":"does not re-run existing task based on clientRequestId","size":5},{"name":"should clear MDC thread local","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.orchestration.AnnotationsBasedAtomicOperationsRegistrySpec","children":[{"name":"annotations based registry should return the converter if the specified name matches the component name","size":1724},{"name":"annotations based registry should fail to return the converter if the specified name matches the component name but an incorrect version is used","size":142},{"name":"annotations based registry should return the converter that matches the AtomicOperationDescription name and cloud provider and default version","size":176},{"name":"annotations based registry should return the converter that matches the AtomicOperationDescription name and cloud provider and version","size":198},{"name":"annotations based registry should throw a NoSuchBeanDefinitionException if no converter found for given name with no cloud provider specified","size":119},{"name":"annotations based registry should throw an AtomicOperationConverterNotFoundException if no converter found for given name with cloud provider specified","size":65},{"name":"uncallable converter should reject any version","size":232},{"name":"annotations based registry should return the validator if the specified name matches the component name","size":144},{"name":"annotations based registry should return the validator that matches the AtomicOperationDescription name and cloud provider","size":126},{"name":"annotations based registry should return a null if no validator found for given name with no cloud provider specified","size":173},{"name":"annotations based registry should return a null if no validator found for given name with no version specified","size":124},{"name":"annotations based registry should return a null if no validator found for given name with cloud provider specified","size":62}]},{"name":"com.netflix.spinnaker.clouddriver.data.task.DefaultTaskSpec","children":[{"name":"status updates and appends to history","size":2},{"name":"task state is checked on updates","size":1},{"name":"task state is checked on complete/fail","size":0},{"name":"failing a task completes it too","size":1},{"name":"history status object doesnt serialize complete and fail","size":66}]},{"name":"com.netflix.spinnaker.clouddriver.data.task.jedis.JedisTaskSpec","children":[{"name":"updating task status adds a history entry","size":80},{"name":"accessing the list of history entries retrieves it from Jedis","size":2},{"name":"task history excludes the final state that marked the task as complete","size":13},{"name":"changing the status of a task to complete saves it to Jedis","size":1},{"name":"failing the status of a task saves it to Jedis","size":1},{"name":"cant update a completed task","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.data.task.jedis.RedisTaskRepositorySpec","children":[{"name":"reads from previous redis if task missing","size":169}]},{"name":"com.netflix.spinnaker.clouddriver.helpers.EnableDisablePercentageCategorizerSpec","children":[{"name":"should pick the right number of elements to move between lists[0]","size":12},{"name":"should pick the right number of elements to move between lists[1]","size":1},{"name":"should pick the right number of elements to move between lists[2]","size":0},{"name":"should pick the right number of elements to move between lists[3]","size":1},{"name":"should pick the right number of elements to move between lists[4]","size":1},{"name":"should pick the right number of elements to move between lists[5]","size":0},{"name":"should pick the right number of elements to move between lists[6]","size":0},{"name":"should pick the right number of elements to move between lists[7]","size":0},{"name":"should pick the right number of elements to move between lists[8]","size":0},{"name":"should pick the right number of elements to move between lists[9]","size":0},{"name":"should pick the right number of elements to move between lists[10]","size":0},{"name":"should pick the right number of elements to move between lists[11]","size":1},{"name":"should pick the right number of elements to move between lists[12]","size":0},{"name":"should pick the right number of elements to move between lists[13]","size":1},{"name":"should pick the right number of elements to move between lists[14]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.helpers.OperationPollerSpec","children":[{"name":"waitForOperation should query the operation at least once","size":1021},{"name":"waitForOperation should return null on timeout","size":1008},{"name":"waitForOperation should increment poll interval properly and retry until timeout","size":12},{"name":"waitForOperation should respect asyncOperationMaxPollingIntervalSeconds","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.helpers.AbstractServerGroupNameResolverSpec","children":[{"name":"next server group name should be app-v001 when takenSlots is [com.netflix.spinnaker.clouddriver.helpers.AbstractServerGroupNameResolver$TakenSlot(app-v000, 0, Wed Dec 31 18:00:00 CST 1969)] and application is 'app', stack is 'null', and details is 'null'","size":29},{"name":"next server group name should be app-new-v000 when takenSlots is null and application is 'app', stack is 'new', and details is 'null'","size":1},{"name":"next server group name should be app-new-v000 when takenSlots is [] and application is 'app', stack is 'new', and details is 'null'","size":1},{"name":"next server group name should be app-test-v010 when takenSlots is [com.netflix.spinnaker.clouddriver.helpers.AbstractServerGroupNameResolver$TakenSlot(app-test-v009, 9, Wed Dec 31 18:00:00 CST 1969)] and application is 'app', stack is 'test', and details is 'null'","size":1},{"name":"next server group name should be app-dev-detail-v016 when takenSlots is [com.netflix.spinnaker.clouddriver.helpers.AbstractServerGroupNameResolver$TakenSlot(app-dev-detail-v015, 15, Wed Dec 31 18:00:00 CST 1969)] and application is 'app', stack is 'dev', and details is 'detail'","size":1},{"name":"next server group name should be app-prod-c0usca-v001 when takenSlots is [com.netflix.spinnaker.clouddriver.helpers.AbstractServerGroupNameResolver$TakenSlot(app-prod-c0usca-v000, 0, Wed Dec 31 18:00:00 CST 1969)] and application is 'app', stack is 'prod', and details is 'c0usca'","size":1},{"name":"resolveNextServerGroupName should handle roll-over properly","size":4},{"name":"resolveNextServerGroupName should throw exception when namespace is exhausted","size":1670},{"name":"generateServerGroupName should throw exception if sequence is invalid[0]","size":1},{"name":"generateServerGroupName should throw exception if sequence is invalid[1]","size":1},{"name":"generateServerGroupName should throw exception if sequence is invalid[2]","size":0},{"name":"generateServerGroupName should throw exception if sequence is invalid[3]","size":0},{"name":"resolveNextServerGroupName should yield v001 when most recent server group does not define sequence number","size":2},{"name":"should fail for invalid characters in the asg name","size":1},{"name":"application, stack, and freeform details make up the asg name","size":1},{"name":"push sequence should be ignored when specified so","size":2},{"name":"application, and stack make up the asg name","size":0},{"name":"application and version make up the asg name","size":1},{"name":"application, and freeform details make up the asg name","size":1}]}]},{"name":"clouddriver-elasticsearch","children":[{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.EntityRefIdBuilderSpec","children":[{"name":"should build identifiers of the form {{cloudProvider}}:{{entityType}}:{{entityId}}:{{account}}:{{region}}","size":528},{"name":"should require non-null 'cloudProvider'","size":8},{"name":"should require non-null 'entityType'","size":0},{"name":"should require non-null 'entityId'","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.converters.UpsertEntityTagsAtomicOperationConverterSpec","children":[{"name":"should set valueType when converting from Map -> Description[0]","size":309},{"name":"should set valueType when converting from Map -> Description[1]","size":10},{"name":"should set valueType when converting from Map -> Description[2]","size":35},{"name":"should set valueType when converting from Map -> Description[3]","size":13}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.ElasticSearchEntityTaggerSpec","children":[{"name":"should construct valid UpsertEntityTagsDescription","size":128},{"name":"should construct valid DeleteEntityTagsDescription[0]","size":7},{"name":"should construct valid DeleteEntityTagsDescription[1]","size":0},{"name":"should only mutate threadLocalTask if null","size":662}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.model.ElasticSearchEntityTagsProviderSpec","children":[{"name":"should support single result retrieval by `EntityTags.id` and `EntityTags.tags`","size":2972},{"name":"should assign entityRef.application if not specified","size":8680},{"name":"should support multi result retrieval by `cloudProvider, `entityType`, `idPrefix` and `tags`","size":4250},{"name":"should flatten a nested map[0]","size":78},{"name":"should flatten a nested map[1]","size":90},{"name":"should flatten a nested map[2]","size":74},{"name":"should flatten a nested map[3]","size":73},{"name":"should filter entity tags when performing a reindex","size":2269},{"name":"should delete multiple entity tags (bulk)","size":7252}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.model.ElasticSearchEntityTagsReconcilerSpec","children":[{"name":"should build provider-specific identifier","size":35},{"name":"should exclude any entity tags that reference a non-existent server group","size":34},{"name":"should reconcile and bulk delete any entity tags that reference a non-existent server group[0]","size":32},{"name":"should reconcile and bulk delete any entity tags that reference a non-existent server group[1]","size":2},{"name":"should filter entity tags by cloud provider, account and region[0]","size":26},{"name":"should filter entity tags by cloud provider, account and region[1]","size":1},{"name":"should filter entity tags by cloud provider, account and region[2]","size":1},{"name":"should filter entity tags by cloud provider, account and region[3]","size":0},{"name":"should filter entity tags by cloud provider, account and region[4]","size":1},{"name":"should filter entity tags by cloud provider, account and region[5]","size":1},{"name":"should filter entity tags by cloud provider, account and region[6]","size":1},{"name":"should filter entity tags by cloud provider, account and region[7]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.ops.BulkUpsertEntityTagsAtomicOperationSpec","children":[{"name":"should perform bulk operation","size":1255},{"name":"should set id and pattern to default if none supplied","size":63},{"name":"should merge tags with duplicate entityRefIds","size":42},{"name":"should create new tag if none exists","size":11},{"name":"should only set modified/by metadata for partial upsert when tag exists","size":57},{"name":"should preserve existing tags when merging","size":16},{"name":"should not halt on exception, but include in results","size":30},{"name":"should throw an exception if the account name cannot be found","size":3},{"name":"should throw an exception if the account id cannot be found","size":4},{"name":"should detect whether entity tags have been modified[0]","size":4},{"name":"should detect whether entity tags have been modified[1]","size":1},{"name":"should detect whether entity tags have been modified[2]","size":0},{"name":"should detect whether entity tags have been modified[3]","size":0},{"name":"should detect whether entity tags have been modified[4]","size":1},{"name":"should detect whether entity tags have been modified[5]","size":1},{"name":"should detect whether entity tags have been modified[6]","size":1},{"name":"should detect whether entity tags have been modified[7]","size":0},{"name":"should detect whether entity tags have been modified[8]","size":1},{"name":"should detect whether entity tags have been modified[9]","size":0},{"name":"should detect whether entity tags have been modified[10]","size":1},{"name":"should detect whether entity tags have been modified[11]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.ops.DeleteEntityTagsAtomicOperationSpec","children":[{"name":"should remove entityTag from ElasticSearch if not found in Front50","size":18},{"name":"should delete entire entityTag if deleteAll flag is set","size":98},{"name":"should delete entire entityTag if all existing tags requested for deletion","size":2},{"name":"should only delete requested tags and metadata if other tags exist","size":9}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.events.CreateServerGroupEventHandlerSpec","children":[{"name":"should only handle events of type CreateServerGroupEvent","size":71}]},{"name":"com.netflix.spinnaker.clouddriver.elasticsearch.events.DeleteServerGroupEventHandlerSpec","children":[{"name":"should only handle DeleteServerGroupEvent","size":18}]}]},{"name":"clouddriver-azure","children":[{"name":"com.netflix.spinnaker.clouddriver.azure.cache.KeysSpec","children":[{"name":"namespace string generation[0]","size":82},{"name":"namespace string generation[1]","size":2},{"name":"namespace string generation[2]","size":1},{"name":"namespace string generation[3]","size":1},{"name":"namespace string generation[4]","size":0},{"name":"namespace string generation[5]","size":0},{"name":"namespace string generation[6]","size":0},{"name":"namespace string generation[7]","size":0},{"name":"namespace string generation[8]","size":1},{"name":"namespace string generation[9]","size":0},{"name":"key parsing","size":86}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.network.model.AzureVirtualNetworkDescriptionSpec","children":[{"name":"Create a simple AzureVirtualNetworkDescription from a given input","size":935},{"name":"Create a full AzureVirtualNetworkDescription from a given input and calculate next subnet address prefix","size":215}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.servergroups.deploy.templates.description.AzureServerGroupDescriptionUnitSpec","children":[{"name":"should generate correct server group description from an Azure scale set","size":266}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.servergroups.deploy.templates.AzureServerGroupResourceTemplateSpec","children":[{"name":"should generate correct ServerGroup resource template","size":873},{"name":"should generate correct ServerGroup resource template with custom image","size":40},{"name":"generate server group template with extensions profile for linux","size":83},{"name":"generate server group template with extension profile for windows","size":11},{"name":"generate server group template with custom data","size":41},{"name":"verify parameters JSON","size":235}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.servergroups.deploy.ops.DestroyAzureServerGroupAtomicOperationSpec","children":[{"name":"Create DestroyAzureServerGroupAtomicOperation object simple test","size":236},{"name":"Create DestroyAzureServerGroupAtomicOperation object with no name and acccountName","size":99}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.appgateway.deploy.template.AzureAppGatewayResourceTemplateSpec","children":[{"name":"generate an Azure Application Gateway resource template using a description object","size":362},{"name":"generate an Azure Application Gateway resource template using a minimal description object","size":2},{"name":"should fail to generate an Azure Application Gateway resource template using a description object with no name","size":7},{"name":"should fail to generate an Azure Application Gateway resource template using a description object with no vnet set","size":0},{"name":"should fail to generate an Azure Application Gateway resource template using a description object with no subnet set","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.appgateway.deploy.converters.UpsertAzureAppGatewayAtomicOperationConverterSpec","children":[{"name":"Create an AzureAppGatewayDescription from a given input","size":51}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.appgateway.deploy.ops.UpsertAzureAppGatewayAtomicOperationSpec","children":[{"name":"Create UpsertAzureAppGatewayAtomicOperation object - simple test","size":60}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.appgateway.deploy.ops.DeleteAzureAppGatewayAtomicOperationSpec","children":[{"name":"Create deleteAzureAppGatewayAtomicOperation object - simple test","size":54}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.loadbalancer.deploy.converters.UpsertAzureLoadBalancerAtomicOperationConverterUnitSpec","children":[{"name":"upsertAzureLoadBalancerDescription type returns AzureLoadBalancerDescription and UpsertAzureLoadBalancerAtomicOperation","size":146}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.loadbalancer.deploy.templates.AzureLoadBalancerResourceTemplateSpec","children":[{"name":"should generate correct LoadBalancer create template","size":143}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.loadbalancer.deploy.ops.UpsertAzureLoadBalancerAtomicOperationUnitSpec","children":[{"name":"create a load balancer dynamic template with two probes and two listners/load balancer rules","size":92}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.loadbalancer.deploy.ops.DeleteAzureLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should fail to delete a Network Load Balancer that does not exist","size":66}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.loadbalancer.deploy.validators.UpsertAzureLoadBalancerDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":31}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.servergroup.model.AzureInstanceSpec","children":[{"name":"should generate a correctly structured instance","size":79}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.servergroup.ops.preprocessors.RegionsToRegionDescriptionPreProcessorSpec","children":[{"name":"should convert legacy descriptions[0]","size":9},{"name":"should convert legacy descriptions[1]","size":0},{"name":"should convert legacy descriptions[2]","size":0},{"name":"should convert legacy descriptions[3]","size":0},{"name":"should convert legacy descriptions[4]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.azure.resources.securitygroup.deploy.templates.AzureSecurityGroupResourceTemplateSpec","children":[{"name":"should generate a correct Azure Security Group create template","size":83}]},{"name":"com.netflix.spinnaker.clouddriver.azure.common.AzureUtilitiesSpec","children":[{"name":"CompareIpv4AddrPrefixes == 0","size":9},{"name":"CompareIpv4AddrPrefixes > 0","size":3},{"name":"CompareIpv4AddrPrefixes < 0","size":2},{"name":"CompareIpv4AddrPrefixes => IllegalArgumentException","size":3},{"name":"GetNextSubnet","size":61},{"name":"GetNextSubnet => IllegalArgumentException","size":6},{"name":"GetNextSubnet => Overflow","size":7},{"name":"getSubnetRangeMax","size":2},{"name":"convertIpv4PrefixToInt","size":12},{"name":"getAddressPrefixLength","size":2},{"name":"getResourceNameFromId","size":1},{"name":"getResourceTypeFromId","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.azure.common.client.AzureStorageClientSpec","children":[{"name":"getAzureCustomVMImage Simple1","size":9},{"name":"getAzureCustomVMImage Simple2","size":0},{"name":"getAzureCustomVMImage Simple3","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.azure.common.client.AzureComputeClientSpec","children":[{"name":"Get all VM images","size":151},{"name":"Create an AzureComputeClient instance","size":4},{"name":"List all the Azure VMImage publishers","size":3},{"name":"List all the Azure VMImage offers","size":2},{"name":"List all the Azure VMImage SKUs","size":4},{"name":"List all the Azure VMImage versions","size":2}]}]},{"name":"clouddriver-eureka","children":[{"name":"com.netflix.spinnaker.clouddriver.eureka.deploy.ops.AbstractEurekaSupportSpec","children":[{"name":"[0]","size":459},{"name":"[1]","size":3},{"name":"[2]","size":2},{"name":"[3]","size":7},{"name":"[4]","size":12},{"name":"[5]","size":16},{"name":"[6]","size":3}]}]},{"name":"clouddriver-dcos","children":[{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.util.mapper.DeployDcosServerGroupDescriptionToAppMapperSpec","children":[{"name":"DeployDcosServerGroupAtomicOperation should deploy the DCOS service successfully","size":381},{"name":"DeployDcosServerGroupAtomicOperation should deploy the DCOS service successfully with many fields left empty","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.util.mapper.AppToDeployDcosServerGroupDescriptionMapperSpec","children":[{"name":"AppToDeployDcosServerGroupDescriptionMapper should map simple fields from the marathon application definition to the description","size":64},{"name":"AppToDeployDcosServerGroupDescriptionMapper should handle null/undefined fields","size":5},{"name":"AppToDeployDcosServerGroupDescriptionMapper should handle null container information","size":4},{"name":"AppToDeployDcosServerGroupDescriptionMapper should handle null docker information","size":3},{"name":"AppToDeployDcosServerGroupDescriptionMapper should populate basic docker information","size":36},{"name":"AppToDeployDcosServerGroupDescriptionMapper handles null docker parameters","size":3},{"name":"AppToDeployDcosServerGroupDescriptionMapper maps portMappings to service endpoints, if present","size":19},{"name":"AppToDeployDcosServerGroupDescriptionMapper sets exposeToHost if the network type is USER and hostPort is 0","size":4},{"name":"AppToDeployDcosServerGroupDescriptionMapper handles null port mappings labels","size":4},{"name":"AppToDeployDcosServerGroupDescriptionMapper maps portDefinitions to service endpoints, if port mappings are not present","size":11},{"name":"AppToDeployDcosServerGroupDescriptionMapper handles null portDefinitions","size":4},{"name":"AppToDeployDcosServerGroupDescriptionMapper handles null port definition labels","size":3},{"name":"AppToDeployDcosServerGroupDescriptionMapper maps health checks","size":13},{"name":"AppToDeployDcosServerGroupDescriptionMapper handles a null command in health checks","size":9},{"name":"AppToDeployDcosServerGroupDescriptionMapper maps readiness checks","size":15},{"name":"AppToDeployDcosServerGroupDescriptionMapper maps volumes","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.util.id.DcosSpinnakerAppIdSpec","children":[{"name":"static factory method should return an empty optional for invalid path \"null\"","size":20},{"name":"static factory method should return an empty optional for invalid path \"\"","size":1},{"name":"static factory method should return an empty optional for invalid path \" \"","size":1},{"name":"static factory method should return an empty optional for invalid path \"-iNv.aLiD-\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"/ \"","size":0},{"name":"static factory method should return an empty optional for invalid path \"/-iNv.aLiD-\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"spinnaker\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/ \"","size":0},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/-iNv.aLiD-\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/ \"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/-iNv.aLiD-\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"spinnaker//service-v000\"","size":2},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/ /service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/-iNv.aLiD-/service-v000\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/test//service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/test/ /service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/test/-iNv.aLiD-/service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/test_/service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/test_ /service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"spinnaker/test_-iNv.aLiD-/service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker//service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/ /service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/-iNv.aLiD-/service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/test//service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/test/ /service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/test/-iNv.aLiD-/service-v000\"","size":1},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/test_/service-v000\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/test_ /service-v000\"","size":0},{"name":"static factory method should return an empty optional for invalid path \"/spinnaker/test_-iNv.aLiD-/service-v000\"","size":1},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [null, test/service, service-v000]","size":1},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [, test/service, service-v000]","size":1},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [ , test/service, service-v000]","size":0},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [-iNv.aLiD-, test/service, service-v000]","size":1},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [spinnaker, , service-v000]","size":1},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [spinnaker, -iNv.aLiD-, service-v000]","size":4},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [spinnaker, test/service, null]","size":0},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [spinnaker, test/service, ]","size":0},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [spinnaker, test/service, ]","size":0},{"name":"static factory method should return an empty optional if the given invalid account, group, and/or serverGroupName: [spinnaker, test/service, -iNv.aLiD-]","size":1},{"name":"the account (spinnaker), group (test), unsafe group (test) and service (service-v000) should be correctly parsed when given a valid path \"spinnaker/test/service-v000\"","size":3},{"name":"the account (spinnaker), group (test_service), unsafe group (test/service) and service (service-v000) should be correctly parsed when given a valid path \"spinnaker/test/service/service-v000\"","size":1},{"name":"the account (spinnaker), group (test), unsafe group (test) and service (service-v000) should be correctly parsed when given a valid absolute path \"/spinnaker/test/service-v000\"","size":1},{"name":"the account (spinnaker), group (test_service), unsafe group (test/service) and service (service-v000) should be correctly parsed when given a valid absolute path \"/spinnaker/test/service/service-v000\"","size":1},{"name":"the namespace (/spinnaker/test) and full path (/spinnaker/test/service-v000) should be correctly built when given a valid account (spinnaker), group (test), serverGroup (service-v000)","size":1},{"name":"the namespace (/spinnaker/test/service) and full path (/spinnaker/test/service/service-v000) should be correctly built when given a valid account (spinnaker), group (test/service), serverGroup (service-v000)","size":1},{"name":"the namespace (/spinnaker/test/service) and full path (/spinnaker/test/service/service-v000) should be correctly built when given a valid account (spinnaker), group (test_service), serverGroup (service-v000)","size":1},{"name":"given a valid marathon path \"spinnaker/test/service-v000\" the parsed path should be \"/spinnaker/test/service-v000\"","size":1},{"name":"given a valid marathon path \"spinnaker/test/service/service-v000\" the parsed path should be \"/spinnaker/test/service/service-v000\"","size":0},{"name":"given a valid absolute marathon path \"/spinnaker/test/service-v000\" the parsed path should be \"/spinnaker/test/service-v000\"","size":1},{"name":"given a valid absolute marathon path \"/spinnaker/test/service/service-v000\" the parsed path should be \"/spinnaker/test/service/service-v000\"","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.util.id.DcosSpinnakerLbIdSpec","children":[{"name":"static factory method should return an empty optional given invalid marathon app id \"/\"","size":6},{"name":"static factory method should return an empty optional given invalid marathon app id \"\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"/spinnaker\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"spinnaker\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"//loadbalancer\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"/ /loadbalancer\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"/-iNv.aLiD-/loadbalancer\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"-iNv.aLiD-/loadbalancer\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"/spinnaker/-iNv.aLiD-\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"spinnaker/-iNv.aLiD-\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"/spinnaker/\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"spinnaker/\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"/spinnaker/ \"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"spinnaker/ \"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"/spinnaker//loadbalancer\"","size":0},{"name":"static factory method should return an empty optional given invalid marathon app id \"spinnaker//loadbalancer\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"/spinnaker/ /loadbalancer\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"spinnaker/ /loadbalancer\"","size":2},{"name":"static factory method should return an empty optional given invalid marathon app id \"/spinnaker/-iNv.aLiD-/loadbalancer\"","size":5},{"name":"static factory method should return an empty optional given invalid marathon app id \"spinnaker/-iNv.aLiD-/loadbalancer\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"/invalid-account/us-west-1/loadbalancer\"","size":1},{"name":"static factory method should return an empty optional given invalid marathon app id \"invalid-account/us-west-1/loadbalancer\"","size":0},{"name":"static factory method should return an empty optional if either account (null)/loadBalancerName (loadbalancer) are invalid","size":1},{"name":"static factory method should return an empty optional if either account ()/loadBalancerName (loadbalancer) are invalid","size":1},{"name":"static factory method should return an empty optional if either account ( )/loadBalancerName (loadbalancer) are invalid","size":1},{"name":"static factory method should return an empty optional if either account (-iNv.aLiD-)/loadBalancerName (loadbalancer) are invalid","size":3},{"name":"static factory method should return an empty optional if either account (spinnaker)/loadBalancerName (null) are invalid","size":1},{"name":"static factory method should return an empty optional if either account (spinnaker)/loadBalancerName () are invalid","size":0},{"name":"static factory method should return an empty optional if either account (spinnaker)/loadBalancerName ( ) are invalid","size":1},{"name":"static factory method should return an empty optional if either account (spinnaker)/loadBalancerName (-iNv.aLiD-) are invalid","size":1},{"name":"the account (spinnaker), lb name (loadbalancer), and haproxy group (spinnaker_loadbalancer) should be correctly parsed when given a valid marathon path \"spinnaker/loadbalancer\"","size":1},{"name":"the account (spinnaker), lb name (loadbalancer), and haproxy group (spinnaker_loadbalancer) should be correctly parsed when given a valid marathon path \"/spinnaker/loadbalancer\"","size":0},{"name":"the account (spinnaker), lb name (loadbalancer), and haproxy group (spinnaker_loadbalancer) should be correctly parsed when given a valid account and loadBalancerName","size":1},{"name":"the account (spinnaker), lb name (loadbalancer), and haproxy group (spinnaker_loadbalancer) should be correctly parsed when given a valid account and loadBalancerName","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.util.id.MarathonPathIdSpec","children":[{"name":"constructor should throw an IllegalArgumentException for invalid path \"null\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \" \"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/ \"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \".\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/.\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"..\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/..\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"-\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/-\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"--\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/--\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \".app\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/.app\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"-app\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/-app\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"app.\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/app.\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"app-\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/app-\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"ap.p\"","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/ap.p\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"ap..p\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid path \"/ap..p\"","size":1},{"name":"constructor should parse valid path \"ap--p\"","size":3},{"name":"constructor should parse valid path \"/ap--p\"","size":2},{"name":"constructor should parse valid path \"app\"","size":0},{"name":"constructor should parse valid path \"/app\"","size":0},{"name":"constructor should parse valid path \"ap-p\"","size":0},{"name":"constructor should parse valid path \"/ap-p\"","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts null","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [, app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [ , app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/ , app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [., app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/., app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [.., app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/.., app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [-, app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/-, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [--, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/--, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [.app, app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/.app, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [-app, app]","size":4},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/-app, app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [app., app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/app., app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [app-, app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/app-, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [ap.p, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/ap.p, app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/ap-p, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [ap..p, app]","size":0},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/ap..p, app]","size":2},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/ap--p, app]","size":1},{"name":"constructor should throw an IllegalArgumentException for invalid parts [/app, app]","size":0},{"name":"constructor should not throw an IllegalArgumentException for valid parts [app, app]","size":0},{"name":"constructor should not throw an IllegalArgumentException for valid parts [ap--p, app]","size":1},{"name":"constructor should not throw an IllegalArgumentException for valid parts [ap-p, app]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.loadbalancer.UpsertDcosLoadBalancerAtomicOperationConverterSpec","children":[{"name":"upsertDcosLoadBalancerAtomicOperationConverter type returns UpsertDcosLoadBalancerAtomicOperationDescription and UpsertDcosLoadBalancerAtomicOperation","size":202}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.loadbalancer.DeleteDcosLoadBalancerAtomicOperationConverterSpec","children":[{"name":"deleteDcosLoadBalancerAtomicOperationConverter type returns DeleteDcosLoadBalancerAtomicOperationDescription and DeleteDcosLoadBalancerAtomicOperation","size":31}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.servergroup.DeployDcosServerGroupAtomicOperationConverterSpec","children":[{"name":"convertDescription should return a valid DeployDcosServerGroupDescription","size":142},{"name":"convertOperation should return a DeployDcosServerGroupAtomicOperation with DeployDcosServerGroupDescription","size":39}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.servergroup.DestroyDcosServerGroupAtomicOperationConverterSpec","children":[{"name":"convertDescription should return a valid DestroyDcosServerGroupDescription","size":23},{"name":"convertOperation should return a DestroyDcosServerGroupAtomicOperation with DestroyDcosServerGroupDescription","size":26}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.servergroup.ResizeDcosServerGroupAtomicOperationConverterSpec","children":[{"name":"convertDescription should return a valid ResizeDcosServerGroupDescription","size":31},{"name":"convertOperation should return a ResizeDcosServerGroupAtomicOperation with ResizeDcosServerGroupDescription","size":14}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.instance.TerminateDcosInstancesAndDecrementAtomicOperationConverterSpec","children":[{"name":"convertDescription should return a valid TerminateDcosInstancesAndDecrementDescription","size":26},{"name":"convertOperation should return a TerminateDcosInstancesAndDecrementAtomicOperation with TerminateDcosInstancesAndDecrementDescription","size":12}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.instance.TerminateDcosInstancesAtomicOperationConverterSpec","children":[{"name":"convertDescription should return a valid TerminateDcosInstancesDescription","size":18},{"name":"convertOperation should return a TerminateDcosInstancesAtomicOperation with TerminateDcosInstancesDescription","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.converters.job.RunDcosJobAtomicOperationConverterSpec","children":[{"name":"convertDescription should return a valid RunDcosJobDescription","size":37},{"name":"convertOperation should return a RunDcosJobAtomicOperation with a RunDcosJobDescription","size":19}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.loadbalancer.UpsertDcosLoadBalancerAtomicOperationSpec","children":[{"name":"UpsertDcosLoadBalancerAtomicOperation should create a new marathon-lb instance if one does not exist for the given name","size":156},{"name":"UpsertDcosLoadBalancerAtomicOperation should create a new marathon-lb instance excluding port definitions 80 and 443 if bindHttpHttps is false","size":11},{"name":"UpsertDcosLoadBalancerAtomicOperation should create a new marathon-lb instance with a service account secret and environment entry if specified in the configuration","size":10},{"name":"UpsertDcosLoadBalancerAtomicOperation will update a marathon-lb instance if one already exists with the same app id","size":22},{"name":"UpsertDcosLoadBalancerAtomicOperation will throw a DcosOperationException if the DCOS deployment does not complete successfully","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.loadbalancer.DeleteDcosLoadBalancerAtomicOperationSpec","children":[{"name":"DeleteDcosLoadBalancerAtomicOperation should delete the load balancer for the given name if it exists","size":16},{"name":"DeleteDcosLoadBalancerAtomicOperation should throw an exception when the given load balancer does not exist","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.servergroup.ResizeDcosServerGroupAtomicOperationSpec","children":[{"name":"ResizeDcosServerGroupAtomicOperation should resize the DCOS service successfully","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.servergroup.DeployDcosServerGroupAtomicOperationSpec","children":[{"name":"DeployDcosServerGroupAtomicOperation should deploy the DCOS service successfully","size":51}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.servergroup.DestroyDcosServerGroupAtomicOperationSpec","children":[{"name":"DestroyDcosServerGroupAtomicOperation should terminate the DCOS service successfully","size":10}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.instance.TerminateDcosInstancesAtomicOperationSpec","children":[{"name":"TerminateDcosInstancesAtomicOperation should terminate the tasks and scale the DCOS service successfully when given instanceIds","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.instance.TerminateDcosInstancesAndDecrementAtomicOperationSpec","children":[{"name":"TerminateDcosInstancesAndDecrementAtomicOperation should terminate the tasks and scale the DCOS service successfully when given instanceIds.","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.ops.job.RunDcosJobAtomicOperationSpec","children":[{"name":"RunDcosJobAtomicOperation should trigger a new job run if the job already exists within DCOS.","size":30},{"name":"RunDcosJobAtomicOperation should create and trigger a job without a schedule if no schedule is given.","size":3},{"name":"RunDcosJobAtomicOperation should create and trigger a job with a schedule if a schedule is given.","size":9}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.loadbalancer.DeleteDcosLoadBalancerAtomicOperationDescriptionValidatorSpec","children":[{"name":"successfully validates when no fields are missing or invalid","size":14},{"name":"reports an error when no credentials are present","size":6},{"name":"reports an error when the loadBalancerName is not provided","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.loadbalancer.UpsertDcosLoadBalancerAtomicOperationDescriptionValidatorSpec","children":[{"name":"successfully validates when no fields are missing or invalid","size":9},{"name":"reports an error when the load balance name is invalid","size":4},{"name":"reports an error when no credentials are present","size":3},{"name":"reports an error when the name is not provided","size":3},{"name":"reports errors for invalid resource capacities","size":4},{"name":"reports an error when acceptedResourceRoles contains a null value","size":2},{"name":"reports an error if portRange is not provided","size":2},{"name":"reports an error if portRange has invalid port definitions","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.servergroup.DestroyDcosServerGroupDescriptionValidatorSpec","children":[{"name":"validate should give errors when given an empty DestroyDcosServerGroupDescription","size":10},{"name":"validate should give errors when given an invalid DestroyDcosServerGroupDescription","size":9},{"name":"validate should give no errors when given an valid DestroyDcosServerGroupDescription","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.servergroup.ResizeDcosServerGroupDescriptionValidatorSpec","children":[{"name":"validate should give errors when given an empty ResizeDcosServerGroupDescription","size":27},{"name":"validate should give errors when given an invalid DestroyDcosServerGroupDescription","size":8},{"name":"validate should give no errors when given an valid DestroyDcosServerGroupDescription","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.servergroup.DisableDcosServerGroupDescriptionValidatorSpec","children":[{"name":"validate should give errors when given an empty DestroyDcosServerGroupDescription","size":13},{"name":"validate should give errors when given an invalid DestroyDcosServerGroupDescription","size":2},{"name":"validate should give no errors when given an valid DestroyDcosServerGroupDescription","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.servergroup.DeployDcosServerGroupDescriptionValidatorSpec","children":[{"name":"validate should give errors when given an empty DeployDcosServerGroupDescription","size":15},{"name":"validate should give errors when given an invalid DeployDcosServerGroupDescription","size":4},{"name":"validate should give no errors when given an valid DeployDcosServerGroupDescription","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.instance.TerminateDcosInstanceDescriptionValidatorSpec","children":[{"name":"validate should give errors when given an empty TerminateDcosInstancesDescription","size":10},{"name":"validate should give no errors when given a TerminateDcosInstancesDescription with instanceId(s)","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.instance.TerminateDcosInstanceAndDecrementDescriptionValidatorSpec","children":[{"name":"validate should give errors when given an empty TerminateDcosInstancesAndDecrementDescription","size":10},{"name":"validate should give no errors when given a TerminateDcosInstancesAndDecrementDescription with instanceId(s)","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.deploy.validators.job.RunDcosJobValidatorSpec","children":[{"name":"validate should give errors when given an empty RunDcosJobDescription","size":11},{"name":"validate should give errors when given a RunDcosJobDescription with invalid credentials and an invalid id","size":4},{"name":"validate should give no errors when given a RunDcosJobDescription with a valid credential and id","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.provider.agent.DcosLoadBalancerCachingAgentSpec","children":[{"name":"On-demand cache should cache a single load balancer","size":364},{"name":"On-demand cache should evict a server group that no longer exists","size":6},{"name":"Newer On-demand cache items should not be replaced by an older version","size":66},{"name":"Older on-demand cache items should be replaced by newer versions","size":20},{"name":"Should cache marathon apps with the SPINNAKER_LOAD_BALANCER label as load balancers","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.provider.agent.DcosServerGroupCachingAgentSpec","children":[{"name":"On-demand cache should cache a single server group","size":209},{"name":"On-demand cache should evict a server group that no longer exists","size":5},{"name":"Newer On-demand cache items should not be replaced by an older version","size":48},{"name":"Older on-demand cache items should be replaced by newer versions","size":27},{"name":"Should cache marathon application and relationships","size":33},{"name":"Should cache instances for each of the tasks belonging to the application","size":17},{"name":"Should only cache marathon tasks that are owned by marathon apps under the supplied account","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.provider.agent.DcosSecretsCachingAgentSpec","children":[{"name":"Should cache secrets when the account has permission to list secrets","size":40},{"name":"Won't cache any secrets when the account does not have the privileges to load them","size":12}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.model.DcosServerGroupSpec","children":[{"name":"load balancers associated to the server group that don't have the same account won't be populated","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.model.DcosLoadBalancerSpec","children":[{"name":"region should be set to 'global' if the load balancer exists directly under the account group","size":15},{"name":"created time is set if available","size":29},{"name":"server group and instance information is populated if provided","size":37},{"name":"bindHttpHttps is set to true on the description when ports 80 and 443 exist in the port definitions","size":2},{"name":"port range is created correctly from the port definitions","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.dcos.DcosConfigurationPropertiesSpec","children":[{"name":"An exception should be thrown if both a service key file and service key data are given.","size":5},{"name":"An exception should be thrown if a password and a service key data are given.","size":1},{"name":"An exception should be thrown if a password and a service key file are given.","size":0},{"name":"An exception should be thrown if an invalid service key file path is given.","size":7},{"name":"An exception should be thrown if a service key data with no valid key structure or data is given.","size":2},{"name":"An exception should be thrown if a service key data with beginning/end markers but no valid key is given.","size":82},{"name":"An exception should be thrown if a service key file with no valid key structure or data is given.","size":10},{"name":"An exception should be thrown if a service key file with beginning/end markers but no valid key is given.","size":2},{"name":"If given valid password, valid config should be built.","size":3},{"name":"If given valid service key data, valid config should be built.","size":101},{"name":"If given valid service key file, valid config should be built.","size":18}]}]},{"name":"clouddriver-aws","children":[{"name":"com.netflix.spinnaker.clouddriver.aws.cache.KeysSpec","children":[{"name":"key fields match namespace fields if present[0]","size":392}]},{"name":"com.netflix.spinnaker.clouddriver.aws.security.config.StringTemplaterSpec","children":[{"name":"it should work","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.aws.security.config.CredentialsLoaderSpec","children":[{"name":"basic test with defaults","size":2683},{"name":"account resolves defaults","size":33},{"name":"availibilityZones are resolved in default regions only once","size":165},{"name":"availabilityZones are resolved for account-specific region if not defined in defaults","size":34},{"name":"account overrides defaults","size":155},{"name":"create single default account","size":82},{"name":"accountId must be provided for assumeRole account types","size":13}]},{"name":"com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProviderSpec","children":[{"name":"client proxies to edda when available","size":18573},{"name":"edda requests handle parameters from request objects","size":164},{"name":"client goes directly to amazon when edda is unavailable","size":1432},{"name":"unmapped describe calls fall back to aws client","size":16},{"name":"describe call with no collection ids calls for the full list when edda is configured","size":129},{"name":"should skip edda when specified","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.aws.security.DefaultAWSAccountInfoLookupSpec","children":[{"name":"it should regex the error","size":100}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.preprocessors.LegacyToAsgsDescriptionPreProcessorSpec","children":[{"name":"should convert legacy descriptions[0]","size":56},{"name":"should convert legacy descriptions[1]","size":1},{"name":"should convert legacy descriptions[2]","size":4},{"name":"should convert legacy descriptions[3]","size":0},{"name":"should convert legacy descriptions[4]","size":1},{"name":"should convert legacy descriptions[5]","size":0},{"name":"should convert legacy descriptions[6]","size":1},{"name":"should convert legacy descriptions[7]","size":0},{"name":"should convert legacy descriptions[8]","size":0},{"name":"should convert legacy descriptions[9]","size":0},{"name":"should convert legacy descriptions[10]","size":0},{"name":"should convert legacy descriptions[11]","size":0},{"name":"should convert legacy descriptions[12]","size":0},{"name":"should convert legacy descriptions[13]","size":1},{"name":"should convert legacy descriptions[14]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.preprocessors.ResizeAsgDescriptionPreProcessorSpec","children":[{"name":"should convert legacy descriptions, with capacity[0]","size":11},{"name":"should convert legacy descriptions, with capacity[1]","size":0},{"name":"should convert legacy descriptions, with capacity[2]","size":3},{"name":"should convert legacy descriptions, with capacity[3]","size":0},{"name":"should convert legacy descriptions, with capacity[4]","size":0},{"name":"should convert legacy descriptions, with capacity[5]","size":0},{"name":"should convert legacy descriptions, with capacity[6]","size":1},{"name":"should convert legacy descriptions, with capacity[7]","size":0},{"name":"should convert legacy descriptions, with capacity[8]","size":1},{"name":"should convert legacy descriptions, with capacity[9]","size":0},{"name":"should convert legacy descriptions, with capacity[10]","size":1},{"name":"should convert legacy descriptions, with capacity[11]","size":0},{"name":"should convert legacy descriptions, with capacity[12]","size":1},{"name":"should convert legacy descriptions, with capacity[13]","size":0},{"name":"should convert legacy descriptions, with capacity[14]","size":0},{"name":"should convert capacity constraints","size":34}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.AutoScalingWorkerUnitSpec","children":[{"name":"deploy workflow is create launch config, create asg[0]","size":418},{"name":"deploy workflow is create launch config, create asg[1]","size":6},{"name":"deploy workflow is create launch config, create asg[2]","size":34},{"name":"deploy workflow is create launch config, create asg[3]","size":13},{"name":"deploy workflow is create launch config, create asg[4]","size":4},{"name":"deploy derives name from ancestor asg and sets the ancestor asg name in the task result","size":334},{"name":"does not enable metrics collection when enabledMetrics are absent","size":26},{"name":"does not enable metrics collection when instanceMonitoring is set to false","size":18},{"name":"enables metrics collection for specified metrics when enabledMetrics are present","size":56},{"name":"continues if serverGroup already exists, is reasonably the same and within safety window","size":265},{"name":"throws duplicate exception if existing autoscaling group was created before safety window","size":59},{"name":"throws duplicate exception if existing and desired autoscaling group differ settings","size":34},{"name":"should validate provided subnet ids against those available for subnet type[0]","size":8},{"name":"should validate provided subnet ids against those available for subnet type[1]","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.BlockDeviceConfigSpec","children":[{"name":"should return block devices for instance type[0]","size":222},{"name":"should return block devices for instance type[1]","size":18},{"name":"should return block devices for instance type[2]","size":106},{"name":"should return block devices for instance type[3]","size":10},{"name":"should return block devices for instance type[4]","size":21},{"name":"should return block devices for instance type[5]","size":9},{"name":"should return block devices for instance type[6]","size":8},{"name":"should return block devices for instance type[7]","size":13},{"name":"should return block devices for instance type[8]","size":67},{"name":"should return block devices for instance type[9]","size":8},{"name":"should return block devices for instance type[10]","size":12},{"name":"should return block devices for instance type[11]","size":14},{"name":"should return block devices for instance type[12]","size":60},{"name":"should return block devices for instance type[13]","size":7},{"name":"should return block devices for instance type[14]","size":32}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.scalingpolicy.DefaultScalingPolicyCopierSpec","children":[{"name":"should copy nothing when there are no scaling policies","size":302},{"name":"should omit actions that are specific to the source account/region when they differ","size":77},{"name":"should copy scaling policies and alarms","size":380}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.DefaultLaunchConfigurationBuilderSpec","children":[{"name":"should lookup security groups when provided by name","size":838},{"name":"should attach an existing application security group if no security groups provided","size":17},{"name":"should add user data to launchconfig with combination from user data provider and description","size":52},{"name":"should add user data to launchconfig with user data provider if description userdata ommitted","size":20},{"name":"should create an application security group if none exists and no security groups provided","size":6},{"name":"should attach classic link security group if vpc is linked","size":8},{"name":"should try to look up classic link security group if vpc is linked","size":5},{"name":"if existing requested group contains app name don't lookup/create app group","size":6},{"name":"if creating an app security group would exceed the maximum number of security groups, use the provided groups","size":9},{"name":"should add existing app security group if configured to do so","size":7},{"name":"should create app security group if addAppGroupToServerGroup and no app group present","size":6},{"name":"should look up and attach classic link security group if vpc is linked","size":7},{"name":"handles block device mappings","size":30}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.AWSServerGroupNameResolverSpec","children":[{"name":"should build TakenSlots based on cached cluster data and Amazon data","size":12},{"name":"should ensure that next server group does not already exist (and increment as necessary until new server group name is found)","size":161},{"name":"should raise IllegalArgumentException if unable to determine next server group","size":10},{"name":"should raise IllegalArgumentException in cluster name is invalid","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.converters.CopyLastAsgAtomicOperationConverterUnitSpec","children":[{"name":"copyLastAsgDescription type returns BasicAmazonDeployDescription and CopyLastAsgAtomicOperation","size":236}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.converters.UpsertAmazonDNSAtomicOperationConverterUnitSpec","children":[{"name":"basicAmazonDeployDescription type returns BasicAmazonDeployDescription and DeployAtomicOperation","size":86}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.converters.BasicAmazonDeployAtomicOperationConverterUnitSpec","children":[{"name":"basicAmazonDeployDescription type returns BasicAmazonDeployDescription and DeployAtomicOperation","size":64},{"name":"should not fail to serialize unknown properties","size":1},{"name":"should probably convert capacity to ints","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.converters.UpsertAmazonLoadBalancerAtomicOperationConverterUnitSpec","children":[{"name":"UpsertAmazonLoadBalancerAtomicOperationConverter convertDescription with no type returns UpsertAmazonLoadBalancerClassicDescription","size":21},{"name":"UpsertAmazonLoadBalancerAtomicOperationConverter convertOperation with no type returns UpsertAmazonLoadBalancerAtomicOperation","size":21},{"name":"UpsertAmazonLoadBalancerAtomicOperationConverter convertDescription with classic type returns UpsertAmazonLoadBalancerV2Description","size":1},{"name":"UpsertAmazonLoadBalancerAtomicOperationConverter convertOperation with classic type returns UpsertAmazonLoadBalancerAtomicOperation","size":0},{"name":"UpsertAmazonLoadBalancerAtomicOperationConverter convertDescription with application type returns UpsertAmazonLoadBalancerV2Description","size":121},{"name":"UpsertAmazonLoadBalancerAtomicOperationConverter convertOperation with application type returns UpsertAmazonLoadBalancerV2AtomicOperation","size":19},{"name":"should coerce types properly in nested structures","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.converters.ModifyAsgAtomicOperationConverterUnitSpec","children":[{"name":"moves \"Default\" termination policy to end of list, if present","size":31},{"name":"leaves termination policies unchanged if \"Default\" is last or not present[0]","size":1},{"name":"leaves termination policies unchanged if \"Default\" is last or not present[1]","size":1},{"name":"leaves termination policies unchanged if \"Default\" is last or not present[2]","size":2},{"name":"leaves termination policies unchanged if \"Default\" is last or not present[3]","size":1},{"name":"leaves termination policies unchanged if \"Default\" is last or not present[4]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.converters.MigrateClusterConfigurationsAtomicOperationConverterSpec","children":[{"name":"converts regionMappings to maps if input as string:string","size":23}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.converters.ResizeAsgAtomicOperationConverterUnitSpec","children":[{"name":"resizeAsgDescription type returns ResizeAsgDescription and ResizeAsgAtomicOperation","size":87}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.AsgLifecycleHookWorkerSpec","children":[{"name":"should no-op with no lifecycle hooks defined","size":80},{"name":"should create clean lifecycle hook name","size":18},{"name":"should create defined lifecycle hooks","size":9}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.description.AsgDescriptionSpec","children":[{"name":"should favor `serverGroupName` over `asgName`","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.TerminateInstanceAndDecrementAsgAtomicOperationUnitSpec","children":[{"name":"operation invokes update to autoscaling group","size":277},{"name":"operation deregisters instances from load balancers","size":87},{"name":"operation adjusts minSize if requested and required","size":22},{"name":"operation fails if minSize adjustment needed but not requested","size":14},{"name":"operation adjusts maxSize to desired size after termination if requested","size":70}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.AbstractEnableDisableAtomicOperationUnitSpec","children":[{"name":"should log unknown asgs","size":194},{"name":"should do nothing without instances","size":29},{"name":"task should fail if an exception occurs during handling","size":13}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.MigrateClusterConfigurationsAtomicOperationSpec","children":[{"name":"performs no migrations when clusters are not matched on account, region, or subnet mappings","size":147},{"name":"migrates matched clusters, reusing security group lookups and subnet analyzers when possible","size":269}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DeleteAmazonImageAtomicOperationSpec","children":[{"name":"should deregister an image","size":79}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.UpsertScalingPolicyAtomicOperationUnitSpec","children":[{"name":"creates unnamed scaling policy","size":239},{"name":"creates unnamed step scaling policy","size":72},{"name":"updates named scaling policy","size":6},{"name":"updates alarm if included","size":10},{"name":"adds policy to alarm actions if not already present","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.UpsertAlarmOperationUnitSpec","children":[{"name":"creates unnamed alarm","size":138},{"name":"updates named alarm","size":1},{"name":"creates alarm for ASG","size":1},{"name":"creates disabled alarm","size":3},{"name":"creates alarm with dimensions","size":5},{"name":"creates alarm with dimensions for ASG","size":2},{"name":"creates alarm with actions","size":2},{"name":"creates alarm with associated scaling policy in prior output","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.RebootInstancesAtomicOperationUnitSpec","children":[{"name":"should reboot instances","size":34}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.UpsertAmiTagsAtomicOperationSpec","children":[{"name":"should skip update if no tags provided","size":161}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.CopyLastAsgAtomicOperationUnitSpec","children":[{"name":"operation builds description based on ancestor asg[0]","size":644},{"name":"operation builds description based on ancestor asg[1]","size":19},{"name":"operation builds description based on ancestor asg[2]","size":29},{"name":"operation builds description based on ancestor asg[3]","size":203},{"name":"operation builds description based on ancestor asg[4]","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.UpsertAsgTagsAtomicOperationUnitSpec","children":[{"name":"operation invokes update to autoscaling group","size":84},{"name":"should fail task if ASG does not exist","size":10}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DeregisterInstancesFromLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should deregister instances from load balancers","size":72},{"name":"should noop task if no load balancers found","size":6},{"name":"should use supplied loadBalancerNames if no ASG specified","size":25},{"name":"should noop task if no load balancer names supplied and no ASG specified","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DetachInstancesAtomicOperationSpec","children":[{"name":"should only detach instances that are associated with the ASG","size":130},{"name":"should not terminate or decrement desired capacity unless explicitly specified","size":14},{"name":"should adjust minSize if specified (and required)","size":17},{"name":"should fail if minSize adjustment is necessary but not allowed","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.UpsertAsgLifecycleHookAtomicOperationUnitSpec","children":[{"name":"creates unnamed lifecycle hook","size":69},{"name":"removes invalid characters from lifecycle hook name","size":1},{"name":"creates named lifecycle hook","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.SuspendAsgProcessesAtomicOperationSpec","children":[{"name":"should suspend ASG processes","size":176},{"name":"should not suspend ASG processes in region if ASG name is invalid","size":7},{"name":"should not suspend ASG processes in region if there is an error","size":14}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.discovery.DiscoverySupportUnitSpec","children":[{"name":"should fail if discovery is not enabled","size":74},{"name":"should fail task if application name is not derivable from existing instance in discovery","size":127},{"name":"should short-circuit if application name is not in discovery and server group does not exist","size":42},{"name":"should enable each instance individually in discovery","size":245},{"name":"should fail but still try all instances before failing task","size":342},{"name":"should succeed despite some failures due to targetHealthyDeployPercentage","size":319},{"name":"should fail despite targetHealthyDeployPercentage=50","size":318},{"name":"should retry on http errors from discovery","size":35},{"name":"should retry on NOT_FOUND from discovery up to DISCOVERY_RETRY_MAX times","size":14},{"name":"should retry on non 200 response from discovery","size":11},{"name":"should NOT fail disable operation if instance is not found","size":20},{"name":"should attempt to mark each instance in discovery even if some fail","size":317},{"name":"should fail verification if asg does not exist[0]","size":32},{"name":"should fail verification if asg does not exist[1]","size":5},{"name":"should fail verification if asg does not exist[2]","size":5},{"name":"should fail verification if asg does not exist[3]","size":5},{"name":"should fail verification if asg does not exist[4]","size":75},{"name":"should fail verification if asg does not exist[5]","size":6},{"name":"should fail verification if asg does not exist[6]","size":6},{"name":"should fail verification if asg does not exist[7]","size":7},{"name":"should fail verification if asg does not exist[8]","size":6},{"name":"should fail verification if asg does not exist[9]","size":4},{"name":"should return Optional.empty() if target asg does not exist[0]","size":1},{"name":"should return Optional.empty() if target asg does not exist[1]","size":5},{"name":"should return true if server group has at least one instance with desired discovery status[0]","size":7},{"name":"should return true if server group has at least one instance with desired discovery status[1]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.discovery.EnableDisableInstancesInDiscoveryAtomicOperationUnitSpec","children":[{"name":"should enable/disable instances in discovery[0]","size":39},{"name":"should enable/disable instances in discovery[1]","size":2},{"name":"should not enable instances in discovery if they are in the Terminated state","size":13},{"name":"should not enable instances in discovery if they are in the Terminating state","size":1},{"name":"should not enable instances in discovery if they are in the Terminating:Proceed state","size":55},{"name":"should not enable instances in discovery if they are in the Terminating:Wait state","size":2},{"name":"should not enable instances in discovery if they are in the Quarantined state","size":1},{"name":"should not enable instances in discovery if they are in the Detached state","size":0},{"name":"should not enable instances in discovery if they are in the Detaching state","size":1},{"name":"should not enable instances in discovery if they are in the EnteringStandby state","size":1},{"name":"should not enable instances in discovery if they are in the Standby state","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.ResumeAsgProcessesAtomicOperationSpec","children":[{"name":"should resume ASG processes","size":40},{"name":"should not resume ASG processes in region if ASG name is invalid","size":57},{"name":"should not resume ASG processes in region if there is an error","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DeleteSecurityGroupAtomicOperationSpec","children":[{"name":"should perform deletion","size":82},{"name":"should perform deletion for non VPC","size":2},{"name":"should perform deletion for VPC","size":2},{"name":"should be idempotent and not fail for deletion when no security group exists","size":3},{"name":"should be idempotent and not fail for deletion when no security group exists with that name","size":1},{"name":"should be idempotent and not fail for deletion when no security group exists in VPC","size":2},{"name":"should be idempotent and not fail for deletion when the security group for the ID no longer exists","size":5},{"name":"should fail on delete for errors other than not found","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DeregisterInstancesFromTargetGroupsAtomicOperationUnitSpec","children":[{"name":"should deregister instances from target groups","size":71},{"name":"should noop task if no load balancers found","size":11},{"name":"should use supplied targetGroupNames if no ASG specified","size":61},{"name":"should noop task if no target group names supplied and no ASG specified","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.loadbalancer.UpsertAmazonLoadBalancerV2AtomicOperationSpec","children":[{"name":"should create load balancer","size":501},{"name":"should create target group for existing load balancer","size":20},{"name":"should modify target group of existing load balancer","size":24},{"name":"should remove missing target group of existing load balancer","size":44},{"name":"should throw error updating a load balancer if listener targets a non-existent target group","size":30},{"name":"should remove and recreate listeners that have changed on an existing load balancer","size":98},{"name":"should attach shield protection to external loadbalancer","size":53}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.loadbalancer.DeleteAmazonLoadBalancerClassicAtomicOperationSpec","children":[{"name":"should perform deletion when invoked","size":27}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.loadbalancer.UpsertAmazonLoadBalancerClassicAtomicOperationSpec","children":[{"name":"should create load balancer","size":561},{"name":"should fail updating a load balancer with no security groups in VPC","size":20},{"name":"should update existing load balancer","size":117},{"name":"should use existing loadbalancer attributes to make no changes if not explicitly provided in description","size":7},{"name":"should use existing loadbalancer attributes to enable cross zone if not explicitly provided in description","size":6},{"name":"should use existing loadbalancer attributes to enable draining if not explicitly provided in description","size":16},{"name":"should use existing loadbalancer attributes to modify timeout if not explicitly provided in description","size":2},{"name":"should use existing loadbalancer attributes to modify idle timeout if not explicitly provided in description","size":2},{"name":"should attempt to apply all listener modifications regardless of individual failures","size":22},{"name":"should respect crossZone balancing directive","size":10},{"name":"should handle VPC ELB creation backward compatibility","size":51},{"name":"should handle VPC ELB creation","size":19},{"name":"should use clusterName if name not provided","size":12},{"name":"should reset existing listeners on a load balancer that already exists","size":68},{"name":"should ignore the old listener of pre-2012 ELBs","size":9},{"name":"should permit ingress from application elb security group to application security group","size":15},{"name":"should auto-create application load balancer security group","size":102},{"name":"should auto-create application load balancer and application security groups","size":20},{"name":"should enable AWS Shield protection if external ELB[0]","size":62},{"name":"should enable AWS Shield protection if external ELB[1]","size":27},{"name":"should enable AWS Shield protection if external ELB[2]","size":14},{"name":"should enable AWS Shield protection if external ELB[3]","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.loadbalancer.DeleteAmazonLoadBalancerV2AtomicOperationSpec","children":[{"name":"should perform deletion when invoked","size":24},{"name":"should abort if deletion protection is enabled","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.loadbalancer.MigrateLoadBalancerStrategySpec","children":[{"name":"throws exception if no availability zones are supplied","size":39},{"name":"resolves zones from source load balancer if requested","size":16},{"name":"throws exception when migrating to VPC and load balancer name (not changed) already exists in Classic","size":104},{"name":"throws exception when migrating to VPC and no subnets found for subnetType","size":44},{"name":"throws exception when migrating to VPC and new load balancer name already exists in Classic","size":5},{"name":"getTargetSecurityGroups maps security group IDs to actual security groups","size":128},{"name":"warns when migrating across accounts on secured listeners","size":42},{"name":"skips skipped security groups","size":24},{"name":"creates app group and elb group and adds classic link ingress when moving from non-VPC to VPC","size":87},{"name":"name generator converts 12345678901234567890123456789012 to 12345678901234567890123456789012","size":0},{"name":"name generator converts 123456789012345678901234567890123 to 12345678901234567890123456789012","size":0},{"name":"name generator converts abc-vpc0 to abc-vpc2","size":0},{"name":"name generator converts abc-vpc to abc-vpc2","size":0},{"name":"name generator converts abc-vpc1 to abc-vpc1-vpc2","size":0},{"name":"name generator converts 123456789012345678901234567-elb to 123456789012345678901234567-vpc2","size":1},{"name":"name generator converts 12345678901234567890123-elb to 12345678901234567890123-elb-vpc2","size":1},{"name":"uses supplied target name if present","size":8},{"name":"generates target name, removing old suffixes","size":9},{"name":"applies health check properties to new load balancer","size":25},{"name":"applies load balancer policies to new load balancer","size":26},{"name":"updates load balancer policies on existing load balancer to match source load balancer","size":9},{"name":"does not try to recreate policies on existing load balancer if they already exist","size":7},{"name":"only adds Reference-Security-Policy attribute if present when creating policy[0]","size":19},{"name":"only adds Reference-Security-Policy attribute if present when creating policy[1]","size":1},{"name":"prefixes policy name if reserved[0]","size":16},{"name":"prefixes policy name if reserved[1]","size":1},{"name":"prefixes policy name if reserved[2]","size":1},{"name":"reuses policies when attributes match","size":10},{"name":"sets cross-zone load balancing flag when legacy listener is present","size":4},{"name":"ignores legacy listeners when generating listener lists","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.ModifyAsgLaunchConfigurationOperationSpec","children":[{"name":"should not modify launch configuration if no changes would result","size":205},{"name":"should apply description fields over existing settings","size":74},{"name":"should disable monitoring if instance monitoring goes from enabled to disabled","size":25},{"name":"should attach classic linked VPC","size":51},{"name":"should append security groups if flag is set","size":11},{"name":"should reset non customized block devices when changing instance type","size":23},{"name":"should not reset custom block devices when changing instance type","size":14},{"name":"should reset custom block devices when changing instance type if explicitly requested","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.RegisterInstancesWithLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should register instances with load balancers","size":14},{"name":"should noop task if no load balancers found","size":57},{"name":"should use supplied load balancer names if no ASG specified","size":6},{"name":"should noop task if no load balancer names supplied and no ASG specified","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.UpdateInstancesAtomicOperationSpec","children":[{"name":"should throw exception when ASG is not in VPC","size":25},{"name":"should throw exception when ASG cannot be found","size":0},{"name":"should update security groups","size":19},{"name":"should look up existing security groups and append them when flag is set","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.CreateNetworkInterfaceAtomicOperationUnitSpec","children":[{"name":"operation invokes create network interface across availability zones","size":195},{"name":"operation handles exceptions creating ENI and continues for all availability zones","size":110},{"name":"operation logs tagging exceptions","size":18}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.RegisterInstancesWithTargetGroupsAtomicOperationUnitSpec","children":[{"name":"should register instances with load balancers","size":17},{"name":"should noop task if no load balancers found","size":8},{"name":"should use supplied load balancer names if no ASG specified","size":7},{"name":"should noop task if no load balancer names supplied and no ASG specified","size":80}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DisableAsgAtomicOperationUnitSpec","children":[{"name":"should deregister instances from load balancer and suspend scaling processes","size":74},{"name":"should not fail if a load balancer does not exist","size":14},{"name":"should disable instances for asg in discovery","size":7},{"name":"should skip discovery if not enabled for account","size":5},{"name":"Should disable 1 instances when 75 percentage is requested","size":75},{"name":"Should disable 2 instances when 100 percentage is requested","size":3},{"name":"Should disable 4 instances when null percentage is requested","size":3},{"name":"Should invoke supend process 1 times when desiredPercentage is null","size":25},{"name":"Should invoke supend process 1 times when desiredPercentage is 100","size":3},{"name":"Should invoke supend process 0 times when desiredPercentage is 0","size":3},{"name":"Should invoke supend process 0 times when desiredPercentage is 50","size":2},{"name":"Should invoke supend process 0 times when desiredPercentage is 99","size":20}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DeleteAsgTagsAtomicOperationUnitSpec","children":[{"name":"should delete tags on ASG by name","size":49}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.TerminateInstancesAtomicOperationUnitSpec","children":[{"name":"should terminate instances","size":20}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DeleteScalingPolicyAtomicOperationUnitSpec","children":[{"name":"delete scaling policy","size":20},{"name":"deletes alarm if no actions or just the policy we deleted are assigned to it[0]","size":52},{"name":"deletes alarm if no actions or just the policy we deleted are assigned to it[1]","size":1},{"name":"does not delete the alarm if other actions are assigned to it[0]","size":1},{"name":"does not delete the alarm if other actions are assigned to it[1]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DestroyAsgAtomicOperationUnitSpec","children":[{"name":"should not fail delete when ASG does not exist","size":56},{"name":"should delete ASG and Launch Config and terminate instances","size":40},{"name":"should not delete launch config when not available","size":5},{"name":"should paginate instance terminations","size":26}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.securitygroup.UpsertSecurityGroupAtomicOperationUnitSpec","children":[{"name":"non-existent security group should be created","size":81},{"name":"non-existent security group should be created with ingress","size":13},{"name":"non-existent security group that is found on create should be updated","size":17},{"name":"existing security group should be unchanged","size":2},{"name":"existing security group should be updated with ingress by name","size":2},{"name":"existing security group should be updated with ingress by id","size":3},{"name":"existing security group should be updated with ingress from another account","size":2},{"name":"existing permissions should not be re-created when a security group is modified","size":44},{"name":"should only append security group ingress","size":40},{"name":"should fail for missing ingress security group in vpc","size":22},{"name":"should two-phase create self-referential security group in vpc","size":3},{"name":"should add ingress by name for missing ingress security group in EC2 classic","size":6},{"name":"should ignore name, peering status, vpcPeeringConnectionId when comparing ingress rules","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.securitygroup.SecurityGroupLookupSpec","children":[{"name":"should create security group","size":37},{"name":"should look up security group","size":3},{"name":"should look up security group, but not call AWS again","size":1},{"name":"should return empty on look up when security group does not exist","size":0},{"name":"should add and remove ingress","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.EnableAsgAtomicOperationUnitSpec","children":[{"name":"should register instances from load balancer and resume scaling processes","size":21},{"name":"should enable instances for asg in discovery","size":3},{"name":"should skip discovery if not enabled for account","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.UpsertAsgScheduledActionsAtomicOperationUnitSpec","children":[{"name":"creates a new scheduled action for each supplied input","size":165},{"name":"deletes any existing scheduled actions if no new actions have the same schedule","size":93},{"name":"updates any existing scheduled actions if they have the same recurrence","size":131}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.dns.UpsertAmazonDNSAtomicOperationSpec","children":[{"name":"operation inherits prior-deployed elb dns name when no target explicitly specified","size":381},{"name":"operation calls out to route53 to UPSERT dns record","size":98}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.ResizeAsgAtomicOperationUnitSpec","children":[{"name":"should update ASG iff it exists and is not in the process of being deleted[0]","size":44},{"name":"should update ASG iff it exists and is not in the process of being deleted[1]","size":14},{"name":"should raise exception if expected capacity constraint is violated[0]","size":1},{"name":"should raise exception if expected capacity constraint is violated[1]","size":7},{"name":"should raise exception if expected capacity constraint is violated[2]","size":0},{"name":"should raise exception if expected capacity constraint is violated[3]","size":1},{"name":"should raise exception if expected capacity constraint is violated[4]","size":0},{"name":"should support resize requests with only some fields to update (min: 42, max: null, desired: null)","size":4},{"name":"should support resize requests with only some fields to update (min: null, max: 42, desired: null)","size":1},{"name":"should support resize requests with only some fields to update (min: null, max: null, desired: 42)","size":0},{"name":"should support resize requests with only some fields to update (min: 0, max: null, desired: null)","size":1},{"name":"should support resize requests with only some fields to update (min: 0, max: 0, desired: 0)","size":1},{"name":"should support resize requests with only some fields to update (min: null, max: null, desired: null)","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.AllowLaunchAtomicOperationUnitSpec","children":[{"name":"image amiId is resolved from name","size":431},{"name":"image attribute modification is invoked on request","size":244},{"name":"should replicate tags","size":35},{"name":"should skip tag replication when target account is the same as the requesting account","size":11},{"name":"should lookup owner account of resolved ami","size":40},{"name":"should return resolved public AMI without performing additional operations","size":14},{"name":"should return resolved third-party private AMI when account allows","size":20},{"name":"should skip allow launch on resolved target AMI if found but still perform tag syncing","size":26}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.AttachClassicLinkVpcAtomicOperationUnitSpec","children":[{"name":"should attach VPC to instance","size":22}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.ops.DeleteAlarmOperationUnitSpec","children":[{"name":"deletes alarms","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.TerminateInstanceAndDecrementAsgDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":114},{"name":"unconfigured region fails validation","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.EnableInstancesInDiscoveryValidatorSpec","children":[{"name":"empty description fails validation","size":4},{"name":"invalid instanceIds fail validation","size":29},{"name":"region is validated against configuration","size":4},{"name":"should fail if discovery is not enabled","size":29}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.UpsertAmazonDNSDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":5},{"name":"type validates against prescribed list","size":1},{"name":"empty target is allowed when an upstream load balancer is produced","size":1},{"name":"hostedZone is resolved for validation","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.ResizeAsgDescriptionValidatorSpec","children":[{"name":"invalid capacity fails validation","size":14},{"name":"empty description fails validation","size":4},{"name":"region is validated against configuration","size":69}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.DeregisterInstancesFromLoadBalancerDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":4},{"name":"invalid instanceIds fail validation","size":1},{"name":"region is validated against configuration","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.DeleteAsgTagsDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":9},{"name":"region is validated against configuration","size":9},{"name":"invalid tags fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.CreateNetworkInterfaceDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":81},{"name":"null input fails validation","size":1},{"name":"unconfigured region fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.DeleteAmazonLoadBalancerDescriptionValidatorSpec","children":[{"name":"should fail validation with invalid load balancer name","size":7},{"name":"region is validates against configuration","size":36}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.AllowLaunchDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":19},{"name":"unconfigured account is rejected","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.AttachClassicLinkVpcDescriptionValidatorSpec","children":[{"name":"invalid instanceId fails validation","size":23},{"name":"invalid vpcId fails validation","size":0},{"name":"unconfigured region fails validation","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.DestroyAsgDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":4},{"name":"region is validated against configuration","size":36}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.UpsertSecurityGroupDescriptionValidatorSpec","children":[{"name":"should reject ingress when unidentified","size":15},{"name":"should allow ingress with name","size":3},{"name":"should allow ingress with id","size":3},{"name":"region is validates against configuration","size":25}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.UpsertAmazonLoadBalancerClassicDescriptionValidatorSpec","children":[{"name":"empty parameters fails validation","size":5},{"name":"unconfigured region is rejected","size":4},{"name":"availability zone not configured for account is rejected","size":4},{"name":"subnetType supercedes availabilityZones","size":13},{"name":"availabilityZones if not subnetType","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.DisableInstancesInDiscoveryValidatorSpec","children":[{"name":"empty description fails validation","size":5},{"name":"invalid instanceIds fail validation","size":3},{"name":"region is validated against configuration","size":3},{"name":"should fail if discovery is not enabled","size":32}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.SuspendAsgProcessesDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":8},{"name":"invalid process names fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.DeleteSecurityGroupDescriptionValidatorSpec","children":[{"name":"should fail validation with invalid security group name","size":7},{"name":"region is validates against configuration","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.UpsertAsgTagsDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":56},{"name":"region is validated against configuration","size":17},{"name":"empty tags fails validation","size":1},{"name":"invalid tags fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.EnableDisableAsgDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":5},{"name":"region is validated against configuration","size":14}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.RegisterInstancesWithLoadBalancerDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":4},{"name":"invalid instanceIds fail validation","size":1},{"name":"region is validated against configuration","size":51}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.ResumeAsgProcessesDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":9},{"name":"invalid process names fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.BasicAmazonDeployDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":4},{"name":"should fail validation if public IP address without subnet","size":2},{"name":"null input fails validation","size":0},{"name":"min/max/desired = 5/3/4 should have 2 errors","size":1},{"name":"min/max/desired = 5/3/null should have 1 errors","size":1},{"name":"min/max/desired = 3/5/7 should have 1 errors","size":0},{"name":"min/max/desired = null/5/7 should have 1 errors","size":1},{"name":"min/max/desired = 3/5/0 should have 1 errors","size":1},{"name":"min/max/desired = 3/null/0 should have 1 errors","size":1},{"name":"min/max/desired = 3/7/5 should have 0 errors","size":0},{"name":"min/max/desired = 3/7/3 should have 0 errors","size":1},{"name":"min/max/desired = 3/7/7 should have 0 errors","size":0},{"name":"min/max/desired = 3/5/null should have 0 errors","size":1},{"name":"min/max/desired = 3/null/7 should have 0 errors","size":1},{"name":"min/max/desired = null/7/5 should have 0 errors","size":2},{"name":"min/max/desired = null/null/7 should have 0 errors","size":1},{"name":"min/max/desired = null/null/null should have 0 errors","size":1},{"name":"unconfigured region fails validation","size":1},{"name":"unconfigured account region fails validation","size":0},{"name":"invalid block device fails validation[0]","size":17},{"name":"invalid block device fails validation[1]","size":1},{"name":"invalid block device fails validation[2]","size":1},{"name":"valid block devices validate","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.TerminateInstancesDescriptionValidatorSpec","children":[{"name":"invalid instanceIds fail validation","size":42},{"name":"unconfigured region fails validation","size":26}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.validators.RebootInstancesDescriptionValidatorSpec","children":[{"name":"empty description fails validation","size":5},{"name":"invalid instanceIds fail validation","size":4},{"name":"region is validated against configuration","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.AmiIdResolverSpec","children":[{"name":"looks up AMI in three ways in order","size":9}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.AsgReferenceCopierSpec","children":[{"name":"should copy scheduled actions","size":71},{"name":"should copy nothing when there are no scheduled actions","size":1},{"name":"should not copy scheduled action start time if older than now","size":0},{"name":"should copy scheduled action and convert time to startTime","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.userdata.LocalFileUserDataProviderSpec","children":[{"name":"replaces expected strings","size":92}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.handlers.MigrateStrategySupportSpec","children":[{"name":"returns immediately when classicLinkGroupName is null","size":6},{"name":"returns without adding an ingress or looking up classic link group if target not found","size":1},{"name":"returns without adding an ingress when classic link group not found","size":2},{"name":"returns without adding an ingress when classic link group already has ingress","size":5},{"name":"adds an ingress when one not already present for classic link group[0]","size":8},{"name":"adds an ingress when one not already present for classic link group[1]","size":1},{"name":"adds an ingress when one not already present for classic link group[2]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.handlers.MigrateSecurityGroupStrategySpec","children":[{"name":"should create target group if createIfSourceMissing is true and source is not found","size":59},{"name":"should throw exception if createIfSourceMissing is false and source is not found","size":2},{"name":"should generate target references, ignoring self","size":15},{"name":"should generate target cross-account references","size":33},{"name":"should warn on references in unknown accounts","size":14},{"name":"should skip infrastructure app dependencies","size":7},{"name":"should skip infrastructure groups if not present in target","size":3},{"name":"should skip missing dependencies if they belong to infrastructure apps","size":6},{"name":"should skip amazon-elb group without warning when target is in VPC, using groupId as name if not present","size":9},{"name":"should include target reference","size":7},{"name":"should flag target as existing if it exists in target location","size":7},{"name":"should halt if any errors are found","size":11},{"name":"generates ingress rules based on source","size":125},{"name":"skips existing ingress rules","size":48},{"name":"creates range rules that do not exist in target","size":15},{"name":"skips existing range rules","size":12}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.handlers.BasicAmazonDeployHandlerUnitSpec","children":[{"name":"handler supports basic deploy description type","size":69},{"name":"handler invokes a deploy feature for each specified region","size":147},{"name":"classic load balancer names are derived from prior execution results","size":20},{"name":"handles classic load balancers","size":12},{"name":"handles application load balancers","size":10},{"name":"fails if load balancer name is not in classic load balancer","size":13},{"name":"should populate classic link VPC Id when classic link is enabled","size":19},{"name":"should not populate classic link VPC Id when there is a subnetType","size":132},{"name":"should send instance class block devices to AutoScalingWorker when matched and none are specified","size":23},{"name":"should favour explicit description block devices over default config","size":17},{"name":"should favour ami block device mappings over explicit description block devices and default config, if useAmiBlockDeviceMappings is set[0]","size":20},{"name":"should favour ami block device mappings over explicit description block devices and default config, if useAmiBlockDeviceMappings is set[1]","size":358},{"name":"should favour ami block device mappings over explicit description block devices and default config, if useAmiBlockDeviceMappings is set[2]","size":14},{"name":"should resolve amiId from amiName","size":14},{"name":"should copy block devices from source provider if not specified explicitly[0]","size":25},{"name":"should copy block devices from source provider if not specified explicitly[1]","size":7},{"name":"should copy block devices from source provider if not specified explicitly[2]","size":4},{"name":"should copy subnet ids from source when available and not explicitly specified[0]","size":58},{"name":"should copy subnet ids from source when available and not explicitly specified[1]","size":6},{"name":"should copy subnet ids from source when available and not explicitly specified[2]","size":4},{"name":"copy source block devices null feature flags","size":20},{"name":"copy source block devices true feature flags","size":3},{"name":"copy source block devices false feature flags","size":4},{"name":"should fail if useSourceCapacity requested, and source not available","size":3},{"name":"should fail if ASG not found and useSourceCapacity requested","size":90},{"name":"should copy capacity from source if specified","size":20},{"name":"should copy scaling policies and scheduled actions[0]","size":58},{"name":"should create 0 lifecycle hooks","size":8},{"name":"should create 1 lifecycle hooks","size":11},{"name":"should create 1 lifecycle hooks","size":55},{"name":"should create 2 lifecycle hooks","size":46},{"name":"should create 1 lifecycle hooks","size":7},{"name":"should create 0 lifecycle hooks","size":14},{"name":"should raise exception for unsupported Transition","size":21},{"name":"should convert block device mappings to AmazonBlockDevices[0]","size":35},{"name":"should convert block device mappings to AmazonBlockDevices[1]","size":11},{"name":"should convert block device mappings to AmazonBlockDevices[2]","size":21},{"name":"should convert block device mappings to AmazonBlockDevices[3]","size":60},{"name":"should convert block device mappings to AmazonBlockDevices[4]","size":13},{"name":"should convert block device mappings to AmazonBlockDevices[5]","size":3},{"name":"should convert block device mappings to AmazonBlockDevices[6]","size":5},{"name":"should convert block device mappings to AmazonBlockDevices[7]","size":4},{"name":"should convert block device mappings to AmazonBlockDevices[8]","size":3},{"name":"should convert block device mappings to AmazonBlockDevices[9]","size":4},{"name":"should convert block device mappings to AmazonBlockDevices[10]","size":4},{"name":"should convert block device mappings to AmazonBlockDevices[11]","size":3},{"name":"should convert block device mappings to AmazonBlockDevices[12]","size":37},{"name":"should throw exception when instance type does not match image virtualization type[0]","size":7},{"name":"should throw exception when instance type does not match image virtualization type[1]","size":32},{"name":"should not throw exception when instance type matches image virtualization type or is unknown[0]","size":10},{"name":"should not throw exception when instance type matches image virtualization type or is unknown[1]","size":6},{"name":"should not throw exception when instance type matches image virtualization type or is unknown[2]","size":15},{"name":"should not throw exception when instance type matches image virtualization type or is unknown[3]","size":7},{"name":"should not throw exception when instance type matches image virtualization type or is unknown[4]","size":17},{"name":"should not throw exception when instance type matches image virtualization type or is unknown[5]","size":9},{"name":"should not throw exception when instance type matches image virtualization type or is unknown[6]","size":7},{"name":"should regenerate block device mappings if instance type changes[0]","size":67},{"name":"should regenerate block device mappings if instance type changes[1]","size":4},{"name":"should regenerate block device mappings if instance type changes[2]","size":10},{"name":"should regenerate block device mappings if instance type changes[3]","size":3},{"name":"should regenerate block device mappings if instance type changes[4]","size":3},{"name":"should substitute {{application}} in iamRole[0]","size":29},{"name":"should substitute {{application}} in iamRole[1]","size":5},{"name":"should substitute {{application}} in iamRole[2]","size":2},{"name":"should substitute {{application}} in iamRole[3]","size":12},{"name":"should substitute {{application}} in iamRole[4]","size":3},{"name":"should assign default EBS optimized flag if unset[0]","size":2},{"name":"should assign default EBS optimized flag if unset[1]","size":2},{"name":"should assign default EBS optimized flag if unset[2]","size":2},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[0]","size":13},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[1]","size":3},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[2]","size":3},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[3]","size":3},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[4]","size":3},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[5]","size":3},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[6]","size":15},{"name":"should apply app/stack/detail tags when `addAppStackDetailTags` is enabled[7]","size":4},{"name":"should not copy reserved aws tags","size":36}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.handlers.MigrateClusterConfigurationStrategySpec","children":[{"name":"sets availability zones, subnetType, iamRole, keyPair on target","size":17},{"name":"generates load balancers from config","size":21},{"name":"handles missing loadBalancers key","size":2},{"name":"generates security groups from config, omitting skipped ones","size":19},{"name":"adds app security group if configured in deployDefaults","size":6},{"name":"replaces app security group if it is already there","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.handlers.LoadBalancerUpsertHandlerSpec","children":[{"name":"should rollback deleted listeners on existing loadbalancer when add listener fails","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.deploy.handlers.MigrateServerGroupStrategySpec","children":[{"name":"generates load balancers from launch config","size":150},{"name":"generates security groups from launch config, filtering skipped ones","size":27},{"name":"adds app security group if configured in deployDefaults","size":11},{"name":"does not add app security group if it is already there","size":15},{"name":"copies over suspended processes","size":125},{"name":"sets source on deploy handler from source parameter and server group name on results","size":19},{"name":"sets name on dryRun","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.health.AmazonHealthIndicatorSpec","children":[{"name":"health fails when amazon appears unreachable","size":123},{"name":"health succeeds when amazon is reachable","size":105}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.ImageCachingAgentSpec","children":[{"name":"should include only private images","size":234},{"name":"should include only public images","size":59},{"name":"should manually filter private images from Edda","size":20},{"name":"should manually filter public images from Edda","size":38}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.AmazonSecurityGroupCachingAgentSpec","children":[{"name":"should add security groups on initial run","size":296},{"name":"should prefer security groups from cache when on_demand record present","size":88}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.AmazonElasticIpCachingAgentSpec","children":[{"name":"should add elastic ips on initial run","size":50},{"name":"should evict elastic ips when not found on subsequent runs","size":21}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.AmazonInstanceTypeCachingAgentSpec","children":[{"name":"can deserialize response payload","size":24},{"name":"noop if no matching accounts","size":8},{"name":"skip data load if etags match","size":98},{"name":"load data if no metadata","size":73},{"name":"load data if metadata mismatch","size":8},{"name":"evict metadata if no etag","size":45}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.ClusterCachingAgentSpec","children":[{"name":"should compare capacity and suspended processes when determining if ASGs are similar[0]","size":23},{"name":"should compare capacity and suspended processes when determining if ASGs are similar[1]","size":0},{"name":"should compare capacity and suspended processes when determining if ASGs are similar[2]","size":0},{"name":"should compare capacity and suspended processes when determining if ASGs are similar[3]","size":0},{"name":"should compare capacity and suspended processes when determining if ASGs are similar[4]","size":1},{"name":"should still index asg if VPCZoneIdentifier contains a deleted subnet[0]","size":137},{"name":"should still index asg if VPCZoneIdentifier contains a deleted subnet[1]","size":1},{"name":"should throw exception if VPCZoneIdentifier contains subnets from multiple vpcs","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.AmazonSubnetCachingAgentSpec","children":[{"name":"should add on initial run","size":49}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.AmazonKeyPairCachingAgentSpec","children":[{"name":"should add on loadData","size":117}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.agent.ReservationReportCachingAgentSpec","children":[{"name":"should record regional error and emit metric","size":177}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.AwsProviderSpec","children":[{"name":"getInstanceKey returns CI account that matches both AWS account ID and eureka host","size":34},{"name":"getInstanceHealthKey returns CI account that matches both AWS account ID and eureka host","size":2},{"name":"getInstanceKey returns QA account that matches both AWS account ID and eureka host","size":1},{"name":"getInstanceHealthKey returns QA account that matches both AWS account ID and eureka host","size":1},{"name":"getInstanceKey returns CI account that just matches AWS account ID, although multiple eurekas per account is allowed","size":0},{"name":"getInstanceHealthKey returns CI account that just matches AWS account ID, although multiple eurekas per account is allowed","size":0},{"name":"getInstanceKey returns QA account that just matches AWS account ID, although multiple eurekas per account is allowed","size":1},{"name":"getInstanceHealthKey returns QA account that just matches AWS account ID, although multiple eurekas per account is allowed","size":1},{"name":"getInstanceKey returns CI account that just matches AWS account ID, and multiple eurekas per account is not allowed","size":2},{"name":"getInstanceHealthKey returns CI account that just matches AWS account ID, and multiple eurekas per account is not allowed","size":1},{"name":"getInstanceKey returns QA account that just matches AWS account ID, and multiple eurekas per account is not allowed","size":0},{"name":"getInstanceHealthKey returns QA account that just matches AWS account ID, and multiple eurekas per account is not allowed","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonKeyPairProviderSpec","children":[{"name":"should retrieve all key Pairs","size":81}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonSecurityGroupProviderSpec","children":[{"name":"getAll lists all","size":48},{"name":"getAllByRegion lists only those in supplied region","size":60},{"name":"getAllByAccount lists only those in supplied account","size":7},{"name":"getAllByAccountAndRegion lists only those in supplied account and region","size":7},{"name":"getAllByAccountAndName lists only those in supplied account with supplied name","size":6},{"name":"get returns match based on account, region, and name","size":14},{"name":"should add both ipRangeRules and securityGroup rules","size":227},{"name":"should add security group ingress with different protocols","size":74},{"name":"should group ipRangeRules by addressable range","size":11},{"name":"should include range rules with the same ip range but different protocols","size":11},{"name":"should fetch and include groupName if not present in ingress rule","size":9},{"name":"should fetch vpcId from cache if group is in a different account","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonSubnetProviderSpec","children":[{"name":"should retrieve all subnets","size":99},{"name":"should parse purpose out of name tag","size":77},{"name":"should parse deprecated out of is_deprecated tag","size":39},{"name":"should handle invalid immutable_metadata","size":21}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonElasticIpProviderSpec","children":[{"name":"getAllByAccount lists elastic ips in the supplied account (any region)[0]","size":24},{"name":"getAllByAccount lists elastic ips in the supplied account (any region)[1]","size":5},{"name":"getAllByAccount lists elastic ips in the supplied account (any region)[2]","size":1},{"name":"getAllByAccount lists elastic ips in the supplied account (any region)[3]","size":5},{"name":"getAllByAccountAndRegion lists elastic ips in the supplied account and region[0]","size":6},{"name":"getAllByAccountAndRegion lists elastic ips in the supplied account and region[1]","size":2},{"name":"getAllByAccountAndRegion lists elastic ips in the supplied account and region[2]","size":1},{"name":"getAllByAccountAndRegion lists elastic ips in the supplied account and region[3]","size":3},{"name":"getAllByAccountAndRegion lists elastic ips in the supplied account and region[4]","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonInstanceTypeProviderSpec","children":[{"name":"should retrieve all instance types","size":97},{"name":"should filter instance types","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonImageProviderSpec","children":[{"name":"should return one image","size":74},{"name":"should not find any image","size":1},{"name":"should throw exception of invalid ami name","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonCloudMetricProviderSpec","children":[{"name":"getMetric returns null when none found","size":55},{"name":"getMetrics throws exception when multiple results found","size":4},{"name":"getMetrics returns a metric when one found","size":17},{"name":"getStatistics sends defaults for statistics, period","size":33},{"name":"getStatistics throws exception if namespace is missing","size":1},{"name":"getStatistics treats all other filter values as dimensions","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonS3DataProviderSpec","children":[{"name":"supports account lookup by id or name","size":157},{"name":"should raise exception if identifier is unsupported[0]","size":1},{"name":"should raise exception if identifier is unsupported[1]","size":0},{"name":"should raise exception if identifier is unsupported[2]","size":4},{"name":"should raise exception if identifier is unsupported[3]","size":1},{"name":"should support identifier iff configuration exists[0]","size":1},{"name":"should support identifier iff configuration exists[1]","size":1},{"name":"should support identifier iff configuration exists[2]","size":1},{"name":"should support identifier iff configuration exists[3]","size":0},{"name":"should stream adhoc results","size":212},{"name":"should deny requests to fetch adhoc results from non-whitelisted buckets or keys","size":1},{"name":"should cache static results","size":10},{"name":"should support filters when static result is of type list","size":72}]},{"name":"com.netflix.spinnaker.clouddriver.aws.lifecycle.LaunchFailureNotificationCleanupAgentSpec","children":[{"name":"should delete launch failure notification tag if server group has no launch failures","size":86},{"name":"should check scaling activities to determine if server group has launch failures[0]","size":8},{"name":"should check scaling activities to determine if server group has launch failures[1]","size":1},{"name":"should check scaling activities to determine if server group has launch failures[2]","size":1},{"name":"should have no launch failures if server group does not exist[0]","size":8},{"name":"should have no launch failures if server group does not exist[1]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.lifecycle.InstanceTerminationLifecycleWorkerSpec","children":[{"name":"should create topic if it does not exist","size":221},{"name":"should create queue if it does not exist","size":23},{"name":"should get update discovery with notification","size":7},{"name":"should process both sns and sqs messages","size":13},{"name":"should build sqs policy supporting both sns and direct notifications","size":79},{"name":"should retry on network errors","size":33}]},{"name":"com.netflix.spinnaker.clouddriver.aws.lifecycle.LaunchFailureNotificationAgentSpec","children":[{"name":"should create topic if it does not exist","size":9},{"name":"should create queue if it does not exist","size":17},{"name":"should delegate to ServerGroupTagger w/ status message, accountId and region","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.aws.lifecycle.ARNSpec","children":[{"name":"should extract accountId, region and name from SQS or SNS ARN[0]","size":1},{"name":"should extract accountId, region and name from SQS or SNS ARN[1]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.lifecycle.LaunchFailureNotificationAgentProviderSpec","children":[{"name":"should support AwsProvider","size":123},{"name":"should return an agent per region in specified account","size":58}]},{"name":"com.netflix.spinnaker.clouddriver.aws.agent.ReconcileClassicLinkSecurityGroupsAgentSpec","children":[{"name":"should noop if reconcile is turned off","size":21},{"name":"should noop if account not set for reconcile mode","size":5},{"name":"should noop if no classic linked vpc","size":69},{"name":"should filter instances that havent been up long enough","size":84},{"name":"should add missing groups","size":52},{"name":"should classiclink non ASG instance","size":8},{"name":"should only include existing groups when classiclinking","size":9},{"name":"should not exceed maximum number of groups","size":94}]},{"name":"com.netflix.spinnaker.clouddriver.aws.agent.CleanupAlarmsAgentSpec","children":[{"name":"should run across all regions/accounts and delete in each","size":1480},{"name":"should not delete alarms that are newer than threshold","size":510},{"name":"should not delete alarms that are found in scaling policies","size":507},{"name":"should not delete alarms that do not appear to be created by Spinnaker","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.aws.agent.CleanupDetachedInstancesAgentSpec","children":[{"name":"should run across all regions/accounts and terminate in each","size":1047},{"name":"should terminate only when explicitly tagged[0]","size":0},{"name":"should terminate only when explicitly tagged[1]","size":0},{"name":"should terminate only when explicitly tagged[2]","size":0},{"name":"should terminate only when explicitly tagged[3]","size":0},{"name":"should terminate only when explicitly tagged[4]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AmazonReservationReportSpec","children":[{"name":"should normalize instance types by size and multiplier[0]","size":16},{"name":"should normalize instance types by size and multiplier[1]","size":1},{"name":"should normalize instance types by size and multiplier[2]","size":0},{"name":"should normalize instance types by size and multiplier[3]","size":1},{"name":"should normalize instance types by size and multiplier[4]","size":1},{"name":"should normalize instance types by size and multiplier[5]","size":0},{"name":"should normalize instance types by size and multiplier[6]","size":2},{"name":"should normalize instance types by size and multiplier[7]","size":1},{"name":"should support regional reservations w/o availabilityZone","size":20},{"name":"should sort reservations by normalized instance type ranking (ascending)","size":5},{"name":"should compare by region, az, family, normalized instance type, os[0]","size":0},{"name":"should compare by region, az, family, normalized instance type, os[1]","size":0},{"name":"should compare by region, az, family, normalized instance type, os[2]","size":0},{"name":"should compare by region, az, family, normalized instance type, os[3]","size":0},{"name":"should compare by region, az, family, normalized instance type, os[4]","size":1},{"name":"should compare by region, az, family, normalized instance type, os[5]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AwsResultsRetrieverSpec","children":[{"name":"should retrieve for all tokens","size":37},{"name":"should retrieve only once if no tokens exist","size":2},{"name":"should retrieve up to limit","size":15},{"name":"should not enforce limit if limitRetrieval is not implemented","size":12}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AmazonServerGroupSpec","children":[{"name":"getting instance status counts for all Up instances","size":20},{"name":"getting instance status counts for all Down instances","size":0},{"name":"getting instance status counts for all Unknown instances","size":0},{"name":"getting instance status counts for all Starting instances","size":0},{"name":"getting instance status counts for all OutOfService instances","size":1},{"name":"server group capacity should use min/max/desired values from asg map","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AmazonInstanceSpec","children":[{"name":"getHealthState for ALL UP health states","size":7},{"name":"getHealthState for ONE DOWN & ONE UP health state","size":4},{"name":"getHealthState for ALL DOWN health state","size":0},{"name":"getHealthState for unhealthy with no UP or DOWN health status","size":3},{"name":"getHealthState for empty health collection","size":0},{"name":"getHealthState for ONE STARTING","size":0},{"name":"getHealthState for ONE STARTING and ONE DOWN","size":1},{"name":"getHealthState for ONE STARTING and ONE OUTOFSERVICE","size":0},{"name":"getHealthState for ONE OUTOFSERVICE, and ONE DOWN","size":0},{"name":"getHealthState for no health, drift offset: -10000 ms","size":0},{"name":"getHealthState for no health, drift offset: 10000 ms","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AmazonMetricStatisticsSpec","children":[{"name":"should sort metrics by timestamp","size":31},{"name":"should add any statistics provided by datapoints","size":1},{"name":"should add unit from first datapoint","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.SubnetAnalyzerSpec","children":[{"name":"should create Subnets from AWS objects","size":62},{"name":"should create subnet without target from AWS object with invalid target","size":4},{"name":"should return subnets for zones","size":353},{"name":"should return no subnet for missing zone","size":4},{"name":"should return no subnets when given a missing zone","size":3},{"name":"should return no subnets when given no zones","size":3},{"name":"should return no subnets for null zone","size":2},{"name":"should fail to return subnets for null purpose","size":3},{"name":"should return subnet for target","size":3},{"name":"should return subnet without target if none specified","size":9},{"name":"should return subnets without a target in addition to targeted ones","size":3},{"name":"should allow multiple subnets with same purpose and zone","size":3},{"name":"should allow limiting number of selected subnets when multiple subnets are present with the same purpose and zone","size":20},{"name":"should not return subnets without purpose","size":49},{"name":"with default VPC, should get the VPC ID for a purpose or get the default VPC ID for empty or null purpose","size":52},{"name":"in EC2 classic, should either get the VPC ID for a subnet purpose or null","size":9},{"name":"should map purpose to VPC ID","size":4},{"name":"should omit purposes in multiple VPCs","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AmazonReservationReportBuilderV3Spec","children":[{"name":"should partially cover a shortfall","size":13},{"name":"should fully cover a shortfall","size":1},{"name":"unable to cover any shortfall","size":0},{"name":"should determine multiplier relative to 'xlarge'[0]","size":0},{"name":"should determine multiplier relative to 'xlarge'[1]","size":0},{"name":"should determine multiplier relative to 'xlarge'[2]","size":0},{"name":"should determine multiplier relative to 'xlarge'[3]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AmazonReservationReportBuilderV4Spec","children":[{"name":"should noop if 'rri_weights' does not exist","size":5},{"name":"should partition surplus by 'rri_weights'","size":58}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.edda.InstanceLoadBalancersSpec","children":[{"name":"should handle duplicated instances","size":50},{"name":"should return up if all load balancers are in service, down if any are out of service","size":7},{"name":"should derive health state from message if not in service[0]","size":1},{"name":"should derive health state from message if not in service[1]","size":0},{"name":"should derive health state from message if not in service[2]","size":1},{"name":"should derive health state from message if not in service[3]","size":0},{"name":"should derive health state from message if not in service[4]","size":1},{"name":"down load balancer should override out of service and up","size":0},{"name":"out of service load balancer should override up","size":3},{"name":"starting load balancer should override all other states","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.edda.InstanceLoadBalancerStateSpec","children":[{"name":"should flatten loadBalancerName onto instance","size":37}]},{"name":"com.netflix.spinnaker.clouddriver.aws.model.AmazonClusterSpec","children":[{"name":"should serialize null loadBalancers and serverGroups as empty arrays","size":102}]},{"name":"com.netflix.spinnaker.clouddriver.aws.controllers.AmazonNamedImageLookupControllerSpec","children":[{"name":"should extract tags from query parameters","size":140},{"name":"should support filtering on 1..* tags","size":25},{"name":"should prevent searches on bad ami-like query: ami","size":11},{"name":"should prevent searches on bad ami-like query: ami-","size":0},{"name":"should prevent searches on bad ami-like query: ami-1234","size":0},{"name":"should prevent searches on bad ami-like query: ami-123456789","size":0},{"name":"should not throw exception when performing acceptable ami-like query: ami_","size":1},{"name":"should not throw exception when performing acceptable ami-like query: ami-12345678","size":0},{"name":"should not throw exception when performing acceptable ami-like query: sami","size":0},{"name":"should not throw exception when performing acceptable ami-like query: ami_12345678","size":0},{"name":"should not throw exception when performing acceptable ami-like query: ami-1234567890abcdef0","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.controllers.AmazonClusterControllerSpec","children":[{"name":"should perform real-time AWS call for auto-scaling activities","size":57}]},{"name":"com.netflix.spinnaker.clouddriver.aws.data.KeysSpec","children":[{"name":"namespace string generation[0]","size":0},{"name":"namespace string generation[1]","size":0},{"name":"key parsing","size":3},{"name":"load balancer key backwards compatibility","size":2},{"name":"key fields match namespace fields if present[0]","size":0},{"name":"key fields match namespace fields if present[1]","size":0},{"name":"key fields match namespace fields if present[2]","size":0},{"name":"key fields match namespace fields if present[3]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.aws.event.DefaultAfterResizeEventHandlerSpec","children":[{"name":"should no-op if desired capacity > 0 or not specified [0]","size":1},{"name":"should no-op if desired capacity > 0 or not specified [1]","size":1},{"name":"should no-op if load balancers present","size":0},{"name":"should no-op if terminating lifecycle hook present","size":32},{"name":"should explicitly terminate instances","size":10}]},{"name":"com.netflix.spinnaker.clouddriver.aws.services.NetworkInterfaceServiceSpec","children":[{"name":"should create network interface","size":34},{"name":"should fail for create Network Interface error","size":11},{"name":"should fail for create Tags error with TagsNotCreatedException","size":59}]},{"name":"com.netflix.spinnaker.clouddriver.aws.services.SecurityGroupServiceSpec","children":[{"name":"should get Security Group for Application","size":88},{"name":"should not get Security Group for Application if it does not exist","size":6},{"name":"should get Security Group IDs for Names","size":2},{"name":"should fail to get Security Group IDs for Names if it does not exist","size":17},{"name":"should create Security Group","size":4},{"name":"should not get vpc security groups for an ec2 application","size":1},{"name":"should get vpc security groups for a vpc application","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.aws.services.AsgServiceSpec","children":[{"name":"should get auto scaling groups","size":8},{"name":"should get single auto scaling group","size":1},{"name":"should return null when auto scaling group does not exist","size":0},{"name":"should get launch configurations","size":5},{"name":"should get single launch configuration","size":1},{"name":"should return null when launch configuration does not exist","size":1},{"name":"should suspend processes","size":21},{"name":"should resume processes","size":7}]}]},{"name":"clouddriver-cloudfoundry","children":[{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.cache.CacheRepositoryTest","children":[{"name":"findApplication()","size":3627},{"name":"findServerGroup()","size":175},{"name":"findCluster()","size":59}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.security.CloudFoundryCredentialsTest","children":[{"name":"serialize()","size":2227}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.ops.DeployCloudFoundryServerGroupAtomicOperationTest","children":[{"name":"mapRoutesShouldReturnFalseWhenInvalidRoutesAreFound()","size":156},{"name":"mapRoutesShouldReturnTrueWhenRoutesAreValid()","size":14},{"name":"convertToMbHandling()","size":5},{"name":"mapRoutesShouldReturnTrueWhenRoutesIsNull()","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.ops.TerminateCloudFoundryServerGroupAtomicOperationTest","children":[{"name":"terminate()","size":15}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.ops.ScaleCloudFoundryServerGroupAtomicOperationTest","children":[{"name":"scale()","size":22},{"name":"failedToScale()","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.ops.DeleteCloudFoundryLoadBalancerAtomicOperationTest","children":[{"name":"deleteLoadBalancer()","size":7},{"name":"nonExistentRoute()","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.ops.StopCloudFoundryServerGroupAtomicOperationTest","children":[{"name":"stop()","size":88},{"name":"failedToStop()","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.ops.StartCloudFoundryServerGroupAtomicOperationTest","children":[{"name":"start()","size":16},{"name":"failedToStart()","size":12}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.model.CloudFoundryClusterTest","children":[{"name":"getDetail()","size":11},{"name":"getStack()","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.model.CloudFoundryLoadBalancerTest","children":[{"name":"serialization()","size":24}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.model.CloudFoundrySpaceTest","children":[{"name":"equality()","size":0},{"name":"fromRegion()","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.model.CloudFoundryApplicationTest","children":[{"name":"getClusterNamesGroupsByAccount()","size":13}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.CloudFoundryClientTest","children":[{"name":"createRetryInterceptorShouldReturnOnEverythingElse()","size":627},{"name":"createRetryInterceptorShouldRetryOnInternalServerErrorsThenTimeOut()","size":1006},{"name":"createRetryInterceptorShouldNotRefreshTokenOnBadCredentials()","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.RoutesTest","children":[{"name":"toRouteId()","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.ServiceInstancesTest","children":[{"name":"getServiceInstanceShouldThrowAnExceptionWhenMultipleServicesAreReturnedFromApi()","size":14},{"name":"shouldNotMakeAPICallWhenNoServiceNamesAreProvided()","size":1},{"name":"destroyServiceInstanceShouldFailIfServiceBindingsExists()","size":4},{"name":"shouldCreateServiceBindingWhenServiceExists()","size":5},{"name":"getServiceInstanceShouldThrowExceptionWhenServiceNameIsBlank()","size":2},{"name":"getServiceInstanceShouldReturnAServiceInstanceWhenExactlyOneIsReturnedFromApi()","size":1},{"name":"shouldThrowCloudFoundryApiErrorWhenMoreThanOneServiceInstanceWithTheSameNameExists()","size":21},{"name":"shouldSuccessfullyCreateService()","size":8},{"name":"shouldUpdateTheServiceIfAlreadyExists()","size":5},{"name":"getServiceInstanceShouldThrowAnExceptionWhenNoServicesAreReturnedFromApi()","size":1},{"name":"shouldThrowExceptionIfServiceExistsAndNeedsChangingButUpdateFails()","size":4},{"name":"shouldThrowAnErrorIfServiceNotFound()","size":2},{"name":"pollServiceInstanceStatusShouldThrowExceptionWhenTimeoutIsExceeded()","size":3016},{"name":"pollServiceInstanceStatusShouldSucceedWhenTheOperationFinishesBeforeTimeoutIsExceeded()","size":2008},{"name":"throwExceptionWhenNoServicePlanExistsWithTheNameProvided()","size":2},{"name":"shouldThrowExceptionWhenCreationReturnsHttpNotFound()","size":3},{"name":"destroyServiceInstanceShouldSucceedWhenNoServiceBindingsExist()","size":1003},{"name":"destroyServiceInstanceShouldThrowExceptionWhenDeleteServiceInstanceFails()","size":2},{"name":"pollServiceInstanceStatusShouldThrowExceptionWhenOperationFails()","size":2008}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.ApplicationsTest","children":[{"name":"errorHandling()","size":657},{"name":"dontScaleApplicationIfInputsAreNullOrZero()","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v2.RouteTest","children":[{"name":"routeSerialization()","size":9}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v3.CreateBuildTest","children":[{"name":"serialize()","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v3.LinkTest","children":[{"name":"getGuid()","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.ErrorCodeTest","children":[{"name":"deserialize()","size":1}]}]},{"name":"clouddriver-appengine","children":[{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.EnableAppengineAtomicOperationConverterSpec","children":[{"name":"enableAppengineDescription type returns EnableDisableAppengineDescription and EnableAppengineAtomicOperation","size":1004}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.DestroyAppengineAtomicOperationConverterSpec","children":[{"name":"destroyAppengineDescription type returns DestroyAppengineDescription and DestroyAppengineAtomicOperation","size":410}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.UpsertAppengineLoadBalancerAtomicOperationConverterSpec","children":[{"name":"upsertAppengineLoadBalancerDescription type returns UpsertAppengineLoadBalancerDescription and UpsertAppengineLoadBalancerAtomicOperation","size":245},{"name":"if input map has splitDescription, converts splitDescription and sets split","size":263}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.DeleteAppengineLoadBalancerAtomicOperationConverterSpec","children":[{"name":"deleteAppengineLoadBalancerDescription type returns DeleteAppengineLoadBalancerDescription and DeleteAppengineLoadBalancerAtomicOperation","size":30}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.UpsertAppengineAutoscalingPolicyAtomicOperationConverterSpec","children":[{"name":"upsertAppengineAutoscalingPolicyDescription type returns UpsertAppengineAutoscalingPolicyDescription and UpsertAppengineAutoscalingPolicyAtomicOperation","size":179}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.DisableAppengineAtomicOperationConverterSpec","children":[{"name":"disableAppengineDescription type returns EnableDisableAppengineDescription and DisableAppengineAtomicOperation","size":61}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.TerminateAppengineInstancesAtomicOperationConverterSpec","children":[{"name":"terminateAppengineInstancesDescription type returns TerminateAppengineInstancesDescription and TerminateAppengineInstancesAtomicOperation","size":97}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.StartAppengineAtomicOperationConverterSpec","children":[{"name":"startAppengineDescription type returns StartStopAppengineDescription and StartAppengineAtomicOperation","size":138}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.converters.DeployAppengineAtomicOperationConverterSpec","children":[{"name":"deployAppengineDescription type returns DeployAppengineDescription and DeployAppengineAtomicOperation","size":176},{"name":"input with an unsupported artifact type throws an AppengineDescriptionConversionException","size":122}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.model.AppengineModelUtilSpec","children":[{"name":"url builder properly builds service urls from selfLink","size":17},{"name":"url builder properly builds service urls from selfLink for default service","size":1},{"name":"url builder properly builds version urls from selfLink","size":1},{"name":"url builder properly builds version urls from selfLink for version in default service","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.ops.EnableAppengineAtomicOperationSpec","children":[{"name":"enable operation should set a server group's allocation to 1","size":1207}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.ops.DisableAppengineAtomicOperationSpec","children":[{"name":"split builder handles precision levels for shardBy types[0]","size":90},{"name":"split builder handles precision levels for shardBy types[1]","size":1},{"name":"split builder handles precision levels for shardBy types[2]","size":1},{"name":"split builder handles precision levels for shardBy types[3]","size":6},{"name":"split builder handles precision levels for shardBy types[4]","size":1},{"name":"split builder handles precision levels for shardBy types[5]","size":3},{"name":"split builder handles precision levels for shardBy types[6]","size":1},{"name":"split builder handles precision levels for shardBy types[7]","size":2},{"name":"split builder handles precision levels for shardBy types[8]","size":1},{"name":"split builder handles precision levels for shardBy types[9]","size":1},{"name":"split builder handles precision levels for shardBy types[10]","size":3},{"name":"split builder handles precision levels for shardBy types[11]","size":1},{"name":"operation can disable a server group","size":193},{"name":"no-op if server group has no allocation","size":22}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.ops.UpsertAppengineLoadBalancerAtomicOperationSpec","children":[{"name":"can update Appengine service using shardBy type and allocation from upsert description[0]","size":3},{"name":"can update Appengine service using shardBy type and allocation from upsert description[1]","size":2},{"name":"can update Appengine service with only shardBy value in description, uses existing service split allocation","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.ops.StartStopAppengineAtomicOperationSpec","children":[{"name":"start and stop operations should call version.patch API with appropriate versions[0]","size":102},{"name":"start and stop operations should call version.patch API with appropriate versions[1]","size":12}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.ops.UpsertAppengineAutoscalingPolicyAtomicOperationSpec","children":[{"name":"can upsert autoscaling policy[0]","size":21},{"name":"can upsert autoscaling policy[1]","size":2},{"name":"can upsert autoscaling policy[2]","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.ops.TerminateAppengineInstancesAtomicOperationSpec","children":[{"name":"can delete an Appengine instance","size":214}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.ops.DestroyAppengineAtomicOperationSpec","children":[{"name":"can delete an Appengine server group","size":135}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.EnableAppengineDescriptionValidatorSpec","children":[{"name":"fails validation if server group cannot be found","size":155},{"name":"passes validation if server group found in cache","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.TerminateAppengineInstancesDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":9},{"name":"fails validation for unknown instance","size":1},{"name":"fails validation for instance with missing fields","size":1},{"name":"null input fails validation","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.DeleteAppengineLoadBalancerDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":90},{"name":"description with loadBalancerName == \"default\" fails validation","size":9},{"name":"null input fails validation","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.DeployAppengineDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":8},{"name":"pass validation without stack, freeFormDetails, promote or stopPreviousVersion","size":3},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.UpsertAppengineAutoscalingPolicyDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":21},{"name":"fails validation if server group has wrong type[0]","size":1},{"name":"fails validation if server group has wrong type[1]","size":1},{"name":"fails validation if server group has wrong type[2]","size":2},{"name":"fails validation if server group not found","size":2},{"name":"fails validation for invalid values for min/max idle instances","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.StandardAppengineAttributeValidatorSpec","children":[{"name":"validate non-empty valid","size":1},{"name":"validate non-empty invalid","size":1},{"name":"validate by regex valid","size":1},{"name":"validate by regex invalid","size":0},{"name":"credentials reject (empty)","size":1},{"name":"credentials reject (unknown)","size":0},{"name":"credentials accept","size":1},{"name":"git credentials reject","size":8},{"name":"git credentials reject (empty)","size":1},{"name":"git credentials accept","size":1},{"name":"details accept","size":1},{"name":"details reject","size":1},{"name":"application accept","size":1},{"name":"application reject","size":1},{"name":"stack accept","size":1},{"name":"stack reject","size":0},{"name":"allocations accept[0]","size":48},{"name":"allocations accept[1]","size":1},{"name":"allocations reject (wrong number of decimal places)[0]","size":1},{"name":"allocations reject (wrong number of decimal places)[1]","size":2},{"name":"allocations reject (does not sum to 1)","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.DisableAppengineDescriptionValidatorSpec","children":[{"name":"passes validation if server group to be disabled does not have allocation of 1","size":10},{"name":"fails validation if server group to be disabled has allocation of 1","size":7},{"name":"fails validation if server group cannot be found","size":1},{"name":"fails validation if parent load balancer cannot be found","size":18}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.UpsertAppengineLoadBalancerDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":18},{"name":"description with allocations that do not sum to 1 fails validation","size":6},{"name":"validates allowed inputs for gradual migration[0]","size":3},{"name":"validates allowed inputs for gradual migration[1]","size":2},{"name":"validates allowed inputs for gradual migration[2]","size":1},{"name":"validates shardBy based on traffic split allocations and gradual migration option[0]","size":4},{"name":"validates shardBy based on traffic split allocations and gradual migration option[1]","size":1},{"name":"traffic split with just shardBy value passes validation","size":2},{"name":"allocation with uncached server group fails validation","size":2},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.StartAppengineDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs[0]","size":5},{"name":"pass validation with proper description inputs[1]","size":0},{"name":"pass validation with proper description inputs[2]","size":0},{"name":"fails validation if server group has wrong type[0]","size":1},{"name":"fails validation if server group has wrong type[1]","size":2},{"name":"fails validation if server group not found","size":2},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.appengine.deploy.validators.DestroyAppengineDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":3},{"name":"null input fails validation","size":0}]}]},{"name":"clouddriver-oracle","children":[{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.handler.BasicOracleDeployHandlerSpec","children":[{"name":"Handles correct description","size":424},{"name":"Create server group","size":2591}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.validator.BasicOracleDeployDescriptionValidatorSpec","children":[{"name":"invalid description fails validation","size":72},{"name":"pass validation with proper description inputs","size":2},{"name":"invalid capacity","size":4},{"name":"invalid targetSize","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.validator.StandardOracleAttributeValidatorSpec","children":[{"name":"validateNotEmptyString ok","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.validator.CreateLoadBalancerDescriptionValidatorSpec","children":[{"name":"Create LoadBalancer with invalid Cert","size":546},{"name":"Create LoadBalancer with invalid Listener","size":38},{"name":"Create LoadBalancer with invalid BackendSet","size":35}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.validator.ResizeOracleServerGroupDescriptionValidatorSpec","children":[{"name":"invalid description fails validation","size":8},{"name":"pass validation with proper description inputs","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.validator.DestroyOracleServerGroupDescriptionValidatorSpec","children":[{"name":"invalid description fails validation","size":7},{"name":"valid description passes validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.validator.EnableDisableOracleServerGroupDescriptionValidatorSpec","children":[{"name":"invalid description fails validation","size":58},{"name":"valid description passes validation","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.converter.DisableOracleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"disableOracleServerGroupDescription type returns EnableDisableOracleServerGroupDescription and DisableOracleServerGroupAtomicOperation","size":103}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.converter.DestroyOracleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"return correct description and operation","size":62}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.converter.ResizeOracleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"resizeOracleServerGroupDescription type returns ResizeOracleServerGroupDescription and ResizeOracleServerGroupAtomicOperation","size":75}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.converter.BasicOracleDeployAtomicOperationConverterUnitSpec","children":[{"name":"basicOracleDeployDescription type returns BasicOracleDeployDescription and DeployAtomicOperation","size":71},{"name":"basicOracleDeployDescription type with free-form details returns BasicOracleDeployDescription and DeployAtomicOperation","size":78},{"name":"should not fail to serialize unknown properties","size":22}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.converter.CreateOracleLoadBalancerAtomicOperationConverterUnitSpec","children":[{"name":"return correct description and operation","size":71}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.converter.EnableOracleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"enableOracleServerGroupDescription type returns EnableDisableOracleServerGroupDescription and EnableOracleServerGroupAtomicOperation","size":99}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.op.DestroyOracleServerGroupAtomicOperationSpec","children":[{"name":"Triggers destroying of a server group","size":70}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.op.DisableOracleServerGroupAtomicOperationSpec","children":[{"name":"Triggers disabling of a server group","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.op.CreateOracleLoadBalancerAtomicOperationSpec","children":[{"name":"Create LoadBalancer","size":137},{"name":"Create LoadBalancer with 2 Listeners","size":25}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.op.EnableOracleServerGroupAtomicOperationSpec","children":[{"name":"Triggers enabling of a server group","size":13}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.deploy.op.ResizeOracleServerGroupAtomicOperationSpec","children":[{"name":"resize up serverGroup from 2 to 4","size":30},{"name":"resize down serverGroup from 3 to 1","size":34},{"name":"resize same size serverGroup","size":26}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.agent.OracleSecurityGroupCachingAgentSpec","children":[{"name":"agent has correct agentType","size":284},{"name":"agent handles null items in list rsp","size":108},{"name":"agent creates correct cache result items","size":224}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.agent.OracleInstanceCachingAgentSpec","children":[{"name":"agent has correct agentType","size":21},{"name":"agent handles null items in listNetworks rsp","size":65},{"name":"agent creates correct cache result items","size":250}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.agent.OracleSubnetCachingAgentSpec","children":[{"name":"agent has correct agentType","size":7},{"name":"agent handles null items in listSubnets rsp","size":27},{"name":"agent creates correct cache result item, filtering out unavailable subnets","size":51}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.agent.OracleImageCachingAgentSpec","children":[{"name":"agent has correct agentType","size":7},{"name":"agent handles null items in listImages rsp","size":21},{"name":"agent creates correct cache result item, filtering out unavailable images and adding shapes","size":77}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.agent.OracleServerGroupCachingAgentSpec","children":[{"name":"agent has correct agentType","size":7},{"name":"agent handles null items in list server group result","size":5},{"name":"agent creates correct cache result items","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.agent.OracleNetworkCachingAgentSpec","children":[{"name":"agent has correct agentType","size":10},{"name":"agent handles null items in listNetworks rsp","size":9},{"name":"agent creates correct cache result item, filtering out unavailable vcns","size":24}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.view.OracleImageProviderSpec","children":[{"name":"get all images from cache","size":82}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.view.OracleNetworkProviderSpec","children":[{"name":"get all networks from cache","size":19}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.view.OracleSecurityGroupProviderSpec","children":[{"name":"get all","size":340},{"name":"get all without rules","size":47},{"name":"get by region","size":35},{"name":"get by account","size":71},{"name":"get by account and name","size":16},{"name":"get by region and account","size":96},{"name":"get single","size":25}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.view.OracleClusterProviderSpec","children":[{"name":"get a server group from the cache","size":105},{"name":"get a cluster from the cache","size":71}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.view.OracleInstanceProviderSpec","children":[{"name":"get instance","size":278}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.provider.view.OracleSubnetProviderSpec","children":[{"name":"get all subnets from cache","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.controller.OracleImageLookupControllerSpec","children":[{"name":"test get image details by Id","size":53},{"name":"test find image by query","size":90},{"name":"should extract tags from query parameters","size":6},{"name":"test find image by query and freeformTags","size":23}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.OracleProviderSpec","children":[{"name":"Testing default values of OracleCloudProvider","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.service.servergroup.DefaultOracleServerGroupServiceSpec","children":[{"name":"create server group","size":121},{"name":"create server group over limit","size":28},{"name":"resize (increase) server group","size":20},{"name":"resize (increase) server group over limit","size":17},{"name":"resize (decrease) server group","size":11},{"name":"enable server group","size":2},{"name":"disable server group","size":3},{"name":"destroy server group","size":2},{"name":"get server group","size":6},{"name":"list all server group","size":4},{"name":"list server group names by cluster","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.oracle.service.servergroup.OracleServerGroupPersistenceSpec","children":[{"name":"upsert server group","size":128},{"name":"delete server group","size":38},{"name":"get server group","size":39},{"name":"list server group names","size":73}]}]},{"name":"clouddriver-kubernetes","children":[{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.security.KubernetesV1CredentialsSpec","children":[{"name":"should ignore kubernetes namespaces","size":4011},{"name":"should use kubernetes namespaces","size":733},{"name":"should omit kubernetes namespaces","size":588},{"name":"should not use kubernetes namespaces only in registry","size":1864},{"name":"shouldn't destroy itself when api server is dead","size":225}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.security.KubernetesConfigParserSpec","children":[{"name":"master url should be set irregardless of trailing slash","size":1902}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.converters.loadbalancer.UpsertKubernetesLoadBalancerAtomicOperationConverterSpec","children":[{"name":"UpsertKubernetesLoadBalancerAtomicOperationSpec matches type signature of parent method","size":173}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.converters.servergroup.CloneKubernetesAtomicOperationConverterSpec","children":[{"name":"CloneKubernetesAtomicOperationConverter type returns CloneKubernetesAtomicOperation and DeployKubernetesAtomicOperationDescription","size":375}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.converters.servergroup.DeployKubernetesAtomicOperationConverterSpec","children":[{"name":"DeployKubernetesAtomicOperationConverter type returns DeployKubernetesAtomicOperation and DeployKubernetesAtomicOperationDescription","size":133}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.ops.KubernetesUtilSpec","children":[{"name":"should correctly build an image description[0]","size":36},{"name":"should correctly build an image description[1]","size":0},{"name":"should correctly build an image description[2]","size":0},{"name":"should correctly build an image description[3]","size":1},{"name":"should correctly build an image description[4]","size":0},{"name":"should correctly build an image description[5]","size":1},{"name":"should correctly build an image description[6]","size":1},{"name":"should correctly build an image description[7]","size":1},{"name":"should correctly build an image description from a digest[0]","size":0},{"name":"should correctly build an image description from a digest[1]","size":0},{"name":"should correctly build an image description from a digest[2]","size":0},{"name":"should correctly build an image description from a digest[3]","size":0},{"name":"should correctly build an image description from a digest[4]","size":1},{"name":"should correctly build an image description from a digest[5]","size":0},{"name":"should correctly build an image description from a digest[6]","size":0},{"name":"should correctly build an image description from a digest[7]","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.ops.loadbalancer.UpsertKubernetesLoadBalancerAtomicOperationSpec","children":[{"name":"should upsert a new loadbalancer","size":811},{"name":"should upsert a new loadbalancer, and overwrite port data","size":495},{"name":"should upsert a new loadbalancer, and insert port data","size":267},{"name":"should upsert a new loadbalancer, and insert ip data","size":221},{"name":"should upsert a new loadbalancer, and set labels","size":209},{"name":"should upsert a new loadbalancer, and copy labels over","size":148}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.ops.servergroup.DeployKubernetesAtomicOperationSpec","children":[{"name":"should deploy a replication controller","size":3626},{"name":"should error when source capacity specified but no source exists","size":673},{"name":"should copy source capacity when specified","size":2441},{"name":"should favor sequence when specified","size":2122}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.ops.servergroup.CloneKubernetesAtomicOperationSpec","children":[{"name":"builds a description based on ancestor server group, overrides nothing","size":93},{"name":"operation builds a description based on ancestor server group, overrides everything","size":34}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.ops.securitygroup.UpsertKubernetesV1SecurityGroupAtomicOperationSpec","children":[{"name":"should upsert a new SecurityGroup with labels and annotations","size":438}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.validators.loadbalancer.UpsertKubernetesLoadBalancerAtomicOperationValidatorSpec","children":[{"name":"validation accept (all fields filled)","size":292},{"name":"validation accept (some fields filled)","size":5},{"name":"validation accept (none cluster ip)","size":1},{"name":"validation reject (bad protocol)","size":4},{"name":"validation reject (bad port name)","size":1},{"name":"validation reject (bad port value)","size":2},{"name":"validation reject (bad ip value)","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.validators.servergroup.CloneKubernetesAtomicOperationValidatorSpec","children":[{"name":"validation accept (all fields filled)","size":223},{"name":"validation accept (minimal fields filled)","size":4},{"name":"validation reject (missing credentials)","size":2},{"name":"validation reject (invalid stack)","size":3},{"name":"validation reject (invalid application)","size":2},{"name":"validation reject (invalid target size)","size":2},{"name":"validation reject (invalid partial container)","size":3},{"name":"validation reject (invalid full container)","size":4},{"name":"validation reject (invalid load balancers)","size":3},{"name":"validation reject (invalid security groups)","size":13},{"name":"validation reject (empty source)","size":19},{"name":"validation reject (empty source server group name)","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.validators.servergroup.DeployKubernetesAtomicOperationValidatorSpec","children":[{"name":"validation accept (all fields filled)","size":314},{"name":"validation accept (minimal fields filled)","size":15},{"name":"validation reject (missing credentials)","size":2},{"name":"validation reject (missing application)","size":13},{"name":"validation reject (invalid stack)","size":3},{"name":"validation reject (invalid application)","size":4},{"name":"validation reject (invalid namespace)","size":350},{"name":"validation reject (invalid target size)","size":3},{"name":"validation reject (invalid partial container)","size":3},{"name":"validation reject (invalid full container)","size":5},{"name":"validation reject (invalid load balancers)","size":2},{"name":"validation reject (invalid security groups)","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.deploy.validators.StandardKubernetesAttributeValidatorSpec","children":[{"name":"notEmpty accept","size":2},{"name":"notEmpty reject","size":1},{"name":"nonNegative accept","size":1},{"name":"nonNegative reject","size":2},{"name":"byRegex accept","size":1},{"name":"byRegex reject","size":2},{"name":"credentials reject (empty)","size":1},{"name":"credentials reject (unknown)","size":1},{"name":"credentials accept","size":2},{"name":"details accept","size":1},{"name":"details reject","size":2},{"name":"name accept","size":0},{"name":"name reject","size":1},{"name":"secretName accept","size":2},{"name":"secretName reject","size":1},{"name":"application accept","size":0},{"name":"application reject","size":1},{"name":"stack accept","size":0},{"name":"stack reject","size":1},{"name":"memory accept","size":3},{"name":"memory reject","size":2},{"name":"cpu accept","size":1},{"name":"cpu reject","size":1},{"name":"namespace accept","size":450},{"name":"namespace reject","size":1257},{"name":"image pull secret accept","size":2},{"name":"image pull secret reject","size":1},{"name":"port accept","size":2},{"name":"port reject","size":0},{"name":"protocol accept","size":2},{"name":"protocol reject","size":0},{"name":"path accept","size":2},{"name":"path reject","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.provider.agent.KubernetesLoadBalancerCachingAgentSpec","children":[{"name":"correctly reports LoadBalancer/kubernetes is handled by the load balancer caching agent (true)","size":378},{"name":"correctly reports ServerGroup/kubernetes is handled by the load balancer caching agent (false)","size":6},{"name":"correctly reports SecurityGroup/kubernetes is handled by the load balancer caching agent (false)","size":1},{"name":"correctly reports ServerGroup/google is handled by the load balancer caching agent (false)","size":2},{"name":"correctly reports LoadBalancer/ is handled by the load balancer caching agent (false)","size":2},{"name":"correctly reports null/ is handled by the load balancer caching agent (false)","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.provider.agent.KubernetesServerGroupCachingAgentSpec","children":[{"name":"Should store a single replication controller object and relationships","size":597},{"name":"correctly reports ServerGroup/kubernetes is handled by the server group caching agent (true)","size":3},{"name":"correctly reports LoadBalancer/kubernetes is handled by the server group caching agent (false)","size":2},{"name":"correctly reports SecurityGroup/kubernetes is handled by the server group caching agent (false)","size":4},{"name":"correctly reports ServerGroup/google is handled by the server group caching agent (false)","size":3},{"name":"correctly reports LoadBalancer/ is handled by the server group caching agent (false)","size":2},{"name":"correctly reports null/ is handled by the server group caching agent (false)","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.provider.agent.KubernetesInstanceCachingAgentSpec","children":[{"name":"should apply cache-ttl annotation to pod","size":694}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.provider.agent.KubernetesV1SecurityGroupCachingAgentSpec","children":[{"name":"correctly reports SecurityGroup/kubernetes is handled by the security group caching agent (true)","size":83},{"name":"correctly reports ServerGroup/kubernetes is handled by the security group caching agent (false)","size":34},{"name":"correctly reports LoadBalancer/kubernetes is handled by the security group caching agent (false)","size":1},{"name":"correctly reports ServerGroup/google is handled by the security group caching agent (false)","size":39},{"name":"correctly reports ServerGroup/ is handled by the security group caching agent (false)","size":1},{"name":"correctly reports null/ is handled by the security group caching agent (false)","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.model.KubernetesInstanceSpec","children":[{"name":"Should report state as Down","size":249},{"name":"Should report state as Up","size":2},{"name":"Should report state as Unknown","size":2},{"name":"Should report pod state as Up","size":23},{"name":"Should report pod state as Unscheduled","size":6},{"name":"Should report pod state as Unknown","size":8},{"name":"Should report pod controller","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v1.model.KubernetesServerGroupSpec","children":[{"name":"Should return 1 up instances","size":161},{"name":"Should return 1 up, 1 down, 1 starting, 1 oos, 1 unknown instances","size":5},{"name":"Should list servergroup with no load balancers as enabled","size":4},{"name":"Should list servergroup with no enabled load balancers as disabled","size":17},{"name":"Should list servergroup with enabled load balancers as enabled","size":1},{"name":"Should list servergroup with mix of load balancers as enabled","size":3},{"name":"Should list servergroup with enabled load balancers but no instances as disabled","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.validator.KubernetesValidationUtilSpec","children":[{"name":"wiring of kind/namespace validation[0]","size":214},{"name":"wiring of kind/namespace validation[1]","size":0},{"name":"wiring of kind/namespace validation[2]","size":0},{"name":"wiring of kind/namespace validation[3]","size":1},{"name":"wiring of kind/namespace validation[4]","size":1},{"name":"validation of namespaces[0]","size":1},{"name":"validation of namespaces[1]","size":0},{"name":"validation of namespaces[2]","size":0},{"name":"validation of namespaces[3]","size":0},{"name":"validation of namespaces[4]","size":0},{"name":"validation of namespaces[5]","size":0},{"name":"validation of namespaces[6]","size":0},{"name":"validation of namespaces[7]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.security.KubernetesSelectorListSpec","children":[{"name":"renders well-formed match expressions for tier in (cache)","size":72},{"name":"renders well-formed match expressions for load = balancer","size":4},{"name":"renders well-formed match expressions for tier in (cache),load = balancer","size":2},{"name":"renders well-formed match expressions for stack notin (canary, backend)","size":2},{"name":"renders well-formed match expressions for stack notin (canary, backend),production","size":2},{"name":"renders well-formed match expressions for load = balancer,balance = loader","size":154},{"name":"renders well-formed match expressions for stack notin (canary, backend),production,load = balancer,balance = loader","size":11},{"name":"renders well-formed match expressions for !production","size":21}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.security.KubernetesSelectorSpec","children":[{"name":"correctly turns the desired selector into a k8s selector string ()","size":1},{"name":"correctly turns the desired selector into a k8s selector string (a = b)","size":0},{"name":"correctly turns the desired selector into a k8s selector string (xy = b)","size":0},{"name":"correctly turns the desired selector into a k8s selector string (a != b)","size":0},{"name":"correctly turns the desired selector into a k8s selector string (xy != b)","size":0},{"name":"correctly turns the desired selector into a k8s selector string (a in (b))","size":1},{"name":"correctly turns the desired selector into a k8s selector string (a in (b, c, d))","size":0},{"name":"correctly turns the desired selector into a k8s selector string (a notin (b))","size":0},{"name":"correctly turns the desired selector into a k8s selector string (a notin (b, c, d))","size":1},{"name":"correctly turns the desired selector into a k8s selector string (a)","size":0},{"name":"correctly turns the desired selector into a k8s selector string (abc)","size":0},{"name":"correctly turns the desired selector into a k8s selector string (!a)","size":1},{"name":"correctly turns the desired selector into a k8s selector string (!abc)","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesDeploymentHandlerSpec","children":[{"name":"check that image is replaced by the artifact replacer","size":564},{"name":"check that image isn't replaced by the artifact replacer","size":8},{"name":"check that image is found","size":23},{"name":"check that configmap volume is replaced by the artifact replacer without an account specified","size":16},{"name":"check that configmap volume is replaced by the artifact replacer","size":9},{"name":"check that configmap volume replaced by the artifact replacer","size":9},{"name":"check that configmap volume is not replaced by the artifact replacer in the wrong account","size":5},{"name":"check that configmap volume is found","size":10},{"name":"check that only secret ref is replaced by the artifact replacer","size":159},{"name":"check that secret ref is not replaced by the artifact replacer","size":9},{"name":"check that secret ref is found","size":7},{"name":"check that only configmap value ref is replaced by the artifact replacer","size":8},{"name":"check that configmap value ref is not replaced by the artifact replacer","size":5},{"name":"check that configmap value ref is found","size":97}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesHorizontalPodAutoscalerHandlerSpec","children":[{"name":"check that the deployment abc is replaced by the artifact replacer","size":11},{"name":"check that the Deployment abc is replaced by the artifact replacer","size":16},{"name":"check that the replicaSet xyz is replaced by the artifact replacer","size":5},{"name":"check that the ReplicaSet xyz is replaced by the artifact replacer","size":4},{"name":"check that the deployment abc is not replaced by the artifact replacer","size":5},{"name":"check that the Deployment abc is not replaced by the artifact replacer","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesStatefulSetHandlerSpec","children":[{"name":"[status] wait for stable state to be observed status is null","size":1400},{"name":"[status] rollout status observable","size":410},{"name":"[status] wait for stable state to be observed","size":58},{"name":"[status] wait for at least the desired replica count to be met","size":57},{"name":"[status] wait for the updated revision to match the current revision","size":33},{"name":"[status] wait for all updated replicas to be scheduled","size":65},{"name":"[status] rollout complete","size":29},{"name":"[status] wait for all updated replicas to be ready","size":44},{"name":"[status] wait for partitioned roll out to finish","size":73},{"name":"[status] wait for updated replicas","size":47},{"name":"[status] wait for partitioned roll out complete","size":26}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.HandlerPrioritySpec","children":[{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNetworkPolicyHandler@722deece is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesPodHandler@26e31023","size":3},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNetworkPolicyHandler@4d666ed0 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesDeploymentHandler@73ba1d57","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNetworkPolicyHandler@55acc6b8 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesStatefulSetHandler@2b422233","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNetworkPolicyHandler@8b1d2a9 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesDaemonSetHandler@23160cdb","size":2},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNetworkPolicyHandler@2a556c89 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesReplicaSetHandler@2c77d7f0","size":2},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNamespaceHandler@4be4ca2b is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNetworkPolicyHandler@4a54c6fa","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNamespaceHandler@44351299 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesRoleBindingHandler@296d3da6","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNamespaceHandler@6fc63324 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesRoleHandler@38b559f","size":2},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesNamespaceHandler@1495ac3e is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesIngressHandler@4a14f29b","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesServiceHandler@efe8a33 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesPodHandler@3733338e","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesServiceHandler@1afb4850 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesDeploymentHandler@602ef62e","size":0},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesConfigMapHandler@4eaf16e6 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesPodHandler@602178ad","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesConfigMapHandler@37d00892 is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesDeploymentHandler@1fe30a8","size":0},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesConfigMapHandler@6af1c42a is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesStatefulSetHandler@ae0b5d8","size":1},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesConfigMapHandler@4d48a4ee is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesDaemonSetHandler@29fce9f9","size":0},{"name":"check that com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesConfigMapHandler@61a1cfa is deployed before (has lower priority rating) com.netflix.spinnaker.clouddriver.kubernetes.v2.op.handler.KubernetesReplicaSetHandler@e7db703","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.op.KubernetesDeployManifestOperationSpec","children":[{"name":"replica set deployer is correctly invoked","size":282},{"name":"replica set deployer uses backup namespace","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesManifestAnnotatorSpec","children":[{"name":"manifests are annotated and deannotated symmetrically[0]","size":9},{"name":"manifests are annotated and deannotated symmetrically[1]","size":1},{"name":"manifests are annotated and deannotated symmetrically[2]","size":0},{"name":"manifests are annotated and deannotated symmetrically[3]","size":0},{"name":"manifests are annotated and deannotated symmetrically[4]","size":0},{"name":"manifests are annotated and deannotated symmetrically[5]","size":0},{"name":"manifests are annotated and deannotated symmetrically[6]","size":0},{"name":"manifests are annotated and deannotated symmetrically[7]","size":0},{"name":"manifests are annotated and deannotated symmetrically[8]","size":0},{"name":"manifests are annotated with the expected prefix[0]","size":0},{"name":"manifests are annotated with the expected prefix[1]","size":1},{"name":"manifests are annotated with the expected prefix[2]","size":111}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesManifestSpec","children":[{"name":"correctly reads fields from basic manifest definition","size":29},{"name":"correctly parses a fully qualified resource name replicaSet/abc","size":10},{"name":"correctly parses a fully qualified resource name replicaSet/abc","size":0},{"name":"correctly parses a fully qualified resource name service/abc","size":0},{"name":"correctly parses a fully qualified resource name service/abc","size":0},{"name":"correctly parses a fully qualified resource name ingress/abc","size":1},{"name":"correctly reads observedGeneration from status","size":88},{"name":"correctly reads generation from manifest","size":24}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.artifact.KubernetesUnversionedArtifactConverterSpec","children":[{"name":"correctly infer unversioned artifact properties[0]","size":72},{"name":"correctly infer unversioned artifact properties[1]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.artifact.KubernetesVersionedArtifactConverterSpec","children":[{"name":"correctly infer versioned artifact properties[0]","size":1},{"name":"correctly infer versioned artifact properties[1]","size":0},{"name":"correctly pick next version[0]","size":14},{"name":"correctly pick next version[1]","size":0},{"name":"correctly pick next version[2]","size":0},{"name":"correctly pick next version[3]","size":1},{"name":"correctly pick next version[4]","size":0},{"name":"correctly pick next version[5]","size":1},{"name":"correctly pick next version[6]","size":0},{"name":"correctly pick next version[7]","size":1},{"name":"correctly pick next version[8]","size":0},{"name":"correctly pick next version[9]","size":0},{"name":"find a matching version by equality","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.artifact.ArtifactReplacerSpec","children":[{"name":"correctly extracts deployment name from hpa","size":43},{"name":"doesn't extract bad kind from hpa","size":3},{"name":"correctly extracts Docker artifacts from image names[0]","size":3},{"name":"correctly extracts Docker artifacts from image names[1]","size":3},{"name":"correctly extracts Docker artifacts from image names[2]","size":2},{"name":"correctly extracts Docker artifacts from image names[3]","size":14},{"name":"correctly extracts Docker artifacts from image names[4]","size":4},{"name":"correctly extracts Docker artifacts from image names[5]","size":3},{"name":"correctly extracts Docker artifacts from image names[6]","size":4},{"name":"correctly extracts Docker artifacts from image names[7]","size":3},{"name":"correctly extracts Docker artifacts from image names[8]","size":2},{"name":"correctly extracts Docker artifacts from image names[9]","size":3},{"name":"correctly extracts Docker artifacts from image names[10]","size":30},{"name":"correctly extracts Docker artifacts from image names[11]","size":5},{"name":"correctly extracts Docker artifacts from image names in initContainers[0]","size":3},{"name":"correctly extracts Docker artifacts from image names in initContainers[1]","size":3},{"name":"correctly extracts Docker artifacts from image names in initContainers[2]","size":4},{"name":"correctly extracts Docker artifacts from image names in initContainers[3]","size":3},{"name":"correctly extracts Docker artifacts from image names in initContainers[4]","size":16},{"name":"correctly extracts Docker artifacts from image names in initContainers[5]","size":3},{"name":"correctly extracts Docker artifacts from image names in initContainers[6]","size":3},{"name":"correctly extracts Docker artifacts from image names in initContainers[7]","size":2},{"name":"correctly extracts Docker artifacts from image names in initContainers[8]","size":3},{"name":"correctly extracts Docker artifacts from image names in initContainers[9]","size":3},{"name":"correctly extracts Docker artifacts from image names in initContainers[10]","size":2},{"name":"correctly extracts Docker artifacts from image names in initContainers[11]","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.agent.KubernetesReplicaSetCachingAgentSpec","children":[{"name":"merges two cache data[0]","size":36},{"name":"merges two cache data[1]","size":1},{"name":"merges two cache data[2]","size":0},{"name":"merges two cache data[3]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.agent.KubernetesCacheDataConvertSpec","children":[{"name":"given a correctly annotated manifest, build attributes & infer relationships[0]","size":95},{"name":"given a correctly annotated manifest, build attributes & infer relationships[1]","size":12},{"name":"given a correctly annotated manifest, build attributes & infer relationships[2]","size":5},{"name":"given a correctly annotated manifest, build attributes & infer relationships[3]","size":6},{"name":"given a single owner reference, correctly build relationships[0]","size":9},{"name":"given a single owner reference, correctly build relationships[1]","size":0},{"name":"given a single owner reference, correctly build relationships[2]","size":0},{"name":"given a single owner reference, correctly build relationships[3]","size":0},{"name":"given a cache data entry, invert its relationships[0]","size":86},{"name":"given a cache data entry, invert its relationships[1]","size":0},{"name":"given a cache data entry, invert its relationships[2]","size":1},{"name":"given a cache data entry, invert its relationships[3]","size":0},{"name":"given a cache data entry, invert its relationships[4]","size":1},{"name":"given a cache data entry, invert its relationships[5]","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.KeysSpec","children":[{"name":"produces correct app keys kubernetes.v2:logical:applications:app","size":1},{"name":"produces correct app keys kubernetes.v2:logical:applications:","size":0},{"name":"produces correct cluster keys kubernetes.v2:logical:clusters:ac:app:cluster","size":0},{"name":"produces correct cluster keys kubernetes.v2:logical:clusters:::","size":0},{"name":"produces correct infra keys kubernetes.v2:infrastructure:replicaSet:ac:namespace:v1-v000","size":3},{"name":"produces correct infra keys kubernetes.v2:infrastructure:service:ac:namespace:v1","size":2},{"name":"produces correct infra keys kubernetes.v2:infrastructure:deployment:ac:namespace:v1","size":0},{"name":"unpacks application key for app","size":7},{"name":"unpacks application key for ","size":1},{"name":"unpacks cluster key for 'name' and 'ac'","size":3},{"name":"unpacks cluster key for 'sdf' and ''","size":0},{"name":"unpacks cluster key for '' and 'ac'","size":1},{"name":"unpacks cluster key for '' and ''","size":0},{"name":"unpacks infrastructure key for 'deployment' and 'apps/v1beta1'","size":3},{"name":"unpacks infrastructure key for 'replicaSet' and 'extensions/v1beta1'","size":0},{"name":"unpacks infrastructure key for 'service' and 'v1'","size":1},{"name":"unpacks infrastructure key for 'ingress' and 'extensions/v1beta1'","size":0}]}]},{"name":"clouddriver-google","children":[{"name":"com.netflix.spinnaker.clouddriver.google.cache.CacheResultBuilderSpec","children":[{"name":"should build a cache result","size":703}]},{"name":"com.netflix.spinnaker.clouddriver.google.security.GoogleNamedAccountCredentialsSpec","children":[{"name":"regionlist should convert to map","size":455},{"name":"instanceTypeList should convert to map","size":1142},{"name":"zoneList should convert to cpu platforms map","size":61}]},{"name":"com.netflix.spinnaker.clouddriver.google.security.GoogleCredentialsInitializerSpec","children":[{"name":"load clouddriver when unable to connect to non-required accounts","size":1514},{"name":"do not load clouddriver when unable to connect to required accounts","size":218}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.preprocessors.ZoneToRegionDescriptionPreProcessorSpec","children":[{"name":"should convert legacy descriptions[0]","size":19},{"name":"should convert legacy descriptions[1]","size":0},{"name":"should convert legacy descriptions[2]","size":1},{"name":"should convert legacy descriptions[3]","size":0},{"name":"should convert legacy descriptions[4]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.preprocessors.TerminateGoogleInstancesDescriptionPreProcessorSpec","children":[{"name":"should convert legacy descriptions[0]","size":15},{"name":"should convert legacy descriptions[1]","size":2},{"name":"should convert legacy descriptions[2]","size":1},{"name":"should convert legacy descriptions[3]","size":1},{"name":"should convert legacy descriptions[4]","size":1},{"name":"should convert legacy descriptions[5]","size":0},{"name":"should convert legacy descriptions[6]","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.UpsertGoogleSecurityGroupAtomicOperationConverterUnitSpec","children":[{"name":"upsertGoogleSecurityGroupDescription type returns UpsertGoogleSecurityGroupDescription and UpsertGoogleSecurityGroupAtomicOperation","size":300}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.UpsertGoogleImageTagsAtomicOperationConverterUnitSpec","children":[{"name":"upsertGoogleImageTagsDescription type returns UpsertGoogleImageTagsDescription and UpsertGoogleImageTagsAtomicOperation","size":43}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.EnableGoogleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"enableGoogleServerGroupDescription type returns EnableDisableGoogleServerGroupDescription and EnableGoogleServerGroupAtomicOperation","size":237}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.BasicGoogleDeployAtomicOperationConverterUnitSpec","children":[{"name":"basicGoogleDeployDescription type returns BasicGoogleDeployDescription and DeployAtomicOperation","size":239},{"name":"basicGoogleDeployDescription type with free-form details returns BasicGoogleDeployDescription and DeployAtomicOperation","size":68},{"name":"basicGoogleDeployDescription type with instance metadata returns BasicGoogleDeployDescription and DeployAtomicOperation","size":120},{"name":"basicGoogleDeployDescription type with tags returns BasicGoogleDeployDescription and DeployAtomicOperation","size":41},{"name":"basicGoogleDeployDescription type with network load balancers returns BasicGoogleDeployDescription and DeployAtomicOperation","size":56},{"name":"should not fail to serialize unknown properties","size":25},{"name":"should convert target size to ints","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.ModifyGoogleServerGroupInstanceTemplateAtomicOperationConverterUnitSpec","children":[{"name":"modifyGoogleServerGroupInstanceTemplateDescription type returns ModifyGoogleServerGroupInstanceTemplateDescription and ModifyGoogleServerGroupInstanceTemplateAtomicOperation","size":58}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.UpsertGoogleServerGroupTagsAtomicOperationConverterUnitSpec","children":[{"name":"upsertGoogleServerGroupTagsDescription type returns UpsertGoogleServerGroupTagsDescription and UpsertGoogleServerGroupTagsAtomicOperation","size":39}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.DeleteGoogleSecurityGroupAtomicOperationConverterUnitSpec","children":[{"name":"deleteGoogleSecurityGroupDescription type returns DeleteGoogleSecurityGroupDescription and DeleteGoogleSecurityGroupAtomicOperation","size":56}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.DeregisterInstancesFromGoogleLoadBalancerAtomicOperationConverterUnitSpec","children":[{"name":"deregisterInstancesFromGoogleLoadBalancerDescription type returns correct description and operation types","size":38}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.RegisterInstancesWithGoogleLoadBalancerAtomicOperationConverterUnitSpec","children":[{"name":"registerInstancesWithGoogleLoadBalancerDescription type returns correct description and operation types","size":24}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.DeleteGoogleAutoscalingPolicyAtomicOperationConverterUnitSpec","children":[{"name":"deleteGoogleScalingPolicyDescription type returns DeleteGoogleScalingPolicyDescription and DeleteGoogleScalingPolicyAtomicOperation","size":46}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.UpsertGoogleAutoscalingPolicyAtomicOperationConverterUnitSpec","children":[{"name":"upsertGoogleScalingPolicyDescription type returns UpsertGoogleScalingPolicyDescription and UpsertGoogleScalingPolicyAtomicOperation","size":83}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.ResizeGoogleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"class com.netflix.spinnaker.clouddriver.google.deploy.description.ResizeGoogleServerGroupDescription and class com.netflix.spinnaker.clouddriver.google.deploy.ops.ResizeGoogleServerGroupAtomicOperation are returned when autoscalingPolicy is null","size":142},{"name":"class com.netflix.spinnaker.clouddriver.google.deploy.description.UpsertGoogleAutoscalingPolicyDescription and class com.netflix.spinnaker.clouddriver.google.deploy.ops.UpsertGoogleAutoscalingPolicyAtomicOperation are returned when autoscalingPolicy is [coolDownPeriodSec:45]","size":39},{"name":"should convert target size to ints","size":19}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.TerminateGoogleInstancesAtomicOperationConverterUnitSpec","children":[{"name":"terminateGoogleInstancesDescription type returns TerminateGoogleInstancesDescription and TerminateGoogleInstancesAtomicOperation","size":24}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.SerializeApplicationAtomicOperationConverterUnitSpec","children":[{"name":"resizeGoogleServerGroupDescription type returns ResizeGoogleServerGroupDescription and ResizeGoogleServerGroupAtomicOperation","size":46}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.RebootGoogleInstancesAtomicOperationConverterUnitSpec","children":[{"name":"rebootGoogleInstancesDescription type returns RebootGoogleInstancesDescription and RebootGoogleInstancesAtomicOperation","size":23}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.UpsertGoogleLoadBalancerAtomicOperationConverterUnitSpec","children":[{"name":"upsertGoogleLoadBalancerDescription type returns UpsertGoogleLoadBalancerDescription and UpsertGoogleLoadBalancerAtomicOperation","size":84},{"name":"createGoogleHttpLoadBalancerDescription type returns UpsertGoogleLoadBalancerDescription and CreateGoogleHttpLoadBalancerAtomicOperation","size":127}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.DestroyGoogleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"destroyGoogleServerGroupDescription type returns DestroyGoogleServerGroupDescription and DestroyGoogleServerGroupAtomicOperation","size":40}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.CreateGoogleInstanceAtomicOperationConverterUnitSpec","children":[{"name":"createGoogleInstanceDescription type returns CreateGoogleInstanceDescription and CreateGoogleInstanceAtomicOperation","size":27}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.TerminateAndDecrementGoogleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"terminateAndDecrementGoogleServerGroupDescription type returns TerminateAndDecrementGoogleServerGroupDescription and TerminateAndDecrementGoogleServerGroupAtomicOperation","size":29}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.DeleteGoogleLoadBalancerAtomicOperationConverterUnitSpec","children":[{"name":"deleteGoogleLoadBalancerDescription type returns DeleteGoogleLoadBalancerDescription and DeleteGoogleLoadBalancerAtomicOperation","size":29}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.DisableGoogleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"disableGoogleServerGroupDescription type returns EnableDisableGoogleServerGroupDescription and DisableGoogleServerGroupAtomicOperation","size":28}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.AbandonAndDecrementGoogleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"abandonAndDecrementGoogleServerGroupDescription type returns AbandonAndDecrementGoogleServerGroupDescription and AbandonAndDecrementGoogleServerGroupAtomicOperation","size":18}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.converters.CopyLastGoogleServerGroupAtomicOperationConverterUnitSpec","children":[{"name":"copyLastGoogleServerGroupDescription type returns BasicGoogleDeployDescription and CopyLastGoogleServerGroupAtomicOperation","size":52},{"name":"copyLastGoogleServerGroupDescription type with source server group returns BasicGoogleDeployDescription and CopyLastGoogleServerGroupAtomicOperation","size":25}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.GoogleOperationPollerSpec","children":[{"name":"waitForOperation should query the operation at least once","size":66},{"name":"waitForOperation should return null on timeout","size":4},{"name":"waitForOperation should increment poll interval properly and retry until timeout","size":8},{"name":"waitForOperation should respect asyncOperationMaxPollingIntervalSeconds","size":5},{"name":"waitForOperation should retry on SocketTimeoutException","size":40}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.GCEUtilSpec","children":[{"name":"query source images should succeed","size":113},{"name":"query source images should query configured imageProjects and succeed","size":15},{"name":"query source images should fail","size":16},{"name":"getImageFromArtifact","size":109},{"name":"getBootImage","size":27},{"name":"instance metadata with zero key-value pairs roundtrips properly","size":12},{"name":"instance metadata with exactly one key-value pair roundtrips properly","size":7},{"name":"instance metadata with more than one key-value pair roundtrips properly","size":1},{"name":"queryInstanceUrls should return matching instances from one zone","size":212},{"name":"queryInstanceUrls should return matching instances from two zones","size":7},{"name":"queryInstanceUrls should throw exception when instance cannot be found","size":10},{"name":"queryInstanceUrls should throw exception when instance is found but in a different region","size":3},{"name":"buildServiceAccount should return an empty list when either email or authScopes are unspecified[0]","size":1},{"name":"buildServiceAccount should return an empty list when either email or authScopes are unspecified[1]","size":1},{"name":"buildServiceAccount should return an empty list when either email or authScopes are unspecified[2]","size":0},{"name":"buildServiceAccount should return an empty list when either email or authScopes are unspecified[3]","size":2},{"name":"buildServiceAccount should prepend base url if necessary[0]","size":5},{"name":"buildServiceAccount should prepend base url if necessary[1]","size":1},{"name":"buildServiceAccount should prepend base url if necessary[2]","size":0},{"name":"calibrateTargetSizeWithAutoscaler should adjust target size to within autoscaler min/max range if necessary[0]","size":4},{"name":"calibrateTargetSizeWithAutoscaler should adjust target size to within autoscaler min/max range if necessary[1]","size":1},{"name":"calibrateTargetSizeWithAutoscaler should adjust target size to within autoscaler min/max range if necessary[2]","size":0},{"name":"checkAllForwardingRulesExist should fail if any loadbalancers aren't found[0]","size":53},{"name":"checkAllForwardingRulesExist should fail if any loadbalancers aren't found[1]","size":3},{"name":"checkAllForwardingRulesExist should fail if any loadbalancers aren't found[2]","size":2},{"name":"checkAllForwardingRulesExist should fail if any loadbalancers aren't found[3]","size":0},{"name":"should add http load balancer backend if metadata exists[0]","size":526},{"name":"should add http load balancer backend if metadata exists[1]","size":6},{"name":"should add http load balancer backend if metadata exists[2]","size":9},{"name":"should add http load balancer backend if metadata exists[3]","size":6},{"name":"should add http load balancer backend if metadata exists[4]","size":13},{"name":"should add http load balancer backend if metadata exists[5]","size":2},{"name":"should derive project id from https://www.googleapis.com/compute/v1/projects/my-test-project/global/firewalls/name-a","size":0},{"name":"should derive project id from www.googleapis.com/compute/v1/projects/my-test-project/global/firewalls/name-a","size":0},{"name":"should derive project id from compute/v1/projects/my-test-project/global/firewalls/name-a","size":0},{"name":"should derive project id from projects/my-test-project/global/firewalls/name-a","size":0},{"name":"should not derive project id from null","size":1},{"name":"should not derive project id from ","size":0},{"name":"should not derive project id from https://www.googleapis.com/compute/v1/my-test-project/global/firewalls/name-a","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.ModifyGoogleServerGroupInstanceTemplateAtomicOperationUnitSpec","children":[{"name":"should not make any changes if no properties are overridden","size":171},{"name":"should set metadata and tags on new instance template","size":291},{"name":"should throw exception if no original instance template properties can be resolved","size":4},{"name":"should throw exception if the original instance template defines a number of network interfaces other than one[0]","size":6},{"name":"should throw exception if the original instance template defines a number of network interfaces other than one[1]","size":4},{"name":"should throw exception if the original instance template defines a number of network interfaces other than one[2]","size":3},{"name":"should throw exception if the original instance template does not define any disks[0]","size":18},{"name":"should throw exception if the original instance template does not define any disks[1]","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.UpsertGoogleImageTagsAtomicOperationUnitSpec","children":[{"name":"should set labels on image with no existing labels","size":333},{"name":"should add to labels on image with existing labels","size":33},{"name":"should fail to create instance because image is invalid","size":19}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.CreateGoogleInstanceAtomicOperationUnitSpec","children":[{"name":"should create instance","size":355},{"name":"should fail to create instance because machine type is invalid","size":2},{"name":"should fail to create instance because image is invalid","size":32}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.ResizeGoogleServerGroupAtomicOperationUnitSpec","children":[{"name":"should resize managed instance group","size":106}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.DeleteGoogleSecurityGroupAtomicOperationUnitSpec","children":[{"name":"should delete firewall rule","size":83}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.DeleteGoogleAutoscalingPolicyAtomicOperationUnitSpec","children":[{"name":"should delete zonal and regional autoscaling policy[0]","size":251},{"name":"should delete zonal and regional autoscaling policy[1]","size":13},{"name":"should delete zonal and regional autoHealing policy[0]","size":245},{"name":"should delete zonal and regional autoHealing policy[1]","size":18},{"name":"delete the instance template when deletePolicyMetadata is called","size":259}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.EnableGoogleServerGroupAtomicOperationUnitSpec","children":[{"name":"should add instances and attach load balancers","size":702},{"name":"should fail if load balancers cannot be resolved","size":13}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.TerminateAndDecrementGoogleServerGroupAtomicOperationUnitSpec","children":[{"name":"should terminate instances[0]","size":272},{"name":"should terminate instances[1]","size":23}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.DeregisterInstancesFromGoogleLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should deregister instances","size":334},{"name":"throws ResourceNotFound with unknown load balancer","size":75}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.UpsertGoogleSslLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should create ssl load balancer if no infrastructure present.","size":567},{"name":"should update backend service if it exists","size":57},{"name":"should update health check if it exists","size":82}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.DeleteGoogleHttpLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should delete Http Load Balancer with one backend service","size":435},{"name":"should delete Http Load Balancer with multiple backend services/health checks","size":22},{"name":"should fail to delete an Http Load Balancer that does not exist","size":2},{"name":"should fail to delete Http Load Balancer if failed to delete a resource","size":18},{"name":"should fail to delete Http Load Balancer if timed out while deleting a resource","size":14},{"name":"should wait on slow deletion of target HTTP proxy and successfully delete simple HTTP Load Balancer","size":11},{"name":"should not delete backend service in more than one url map","size":7},{"name":"should fail if server group still associated","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.UpsertGoogleLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should create a network load balancer with health checks","size":199},{"name":"should create a network load balancer with port range and health checks","size":26},{"name":"should create a network load balancer without health checks if none are specified","size":38},{"name":"should create a network load balancer with the specified IP protocol if it is supported","size":22},{"name":"should neither create anything new, nor edit anything existing, if a forwarding rule with the same name already exists in the same region","size":58},{"name":"should throw an exception if a forwarding rule with the same name already exists in a different region","size":7},{"name":"should update health check if specified properties differ from existing","size":90},{"name":"should neither create anything new, nor edit anything existing, if a forwarding rule, target pool and health check with the same properties already exist","size":9},{"name":"should delete and recreate forwarding rule with same name if specified properties differ from existing","size":53},{"name":"should add health check and update target pool if existing target pool does not have specified health check","size":55},{"name":"should remove health check and update target pool if existing target pool has health check and none is desired","size":124},{"name":"should add missing instances to target pool","size":16},{"name":"should remove extraneous instances from target pool","size":16},{"name":"should both add missing instances to target pool and remove extraneous instances from target pool","size":9},{"name":"should neither add instances to target pool nor remove instances from target pool if specified set matches existing set","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.DeleteGoogleTcpLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should delete tcp load balancer","size":221},{"name":"should fail to delete tcp load balancer that doesn't exist","size":3},{"name":"should fail to delete a tcp load balancer if we fail to delete a resource","size":6},{"name":"should fail if server group still attached","size":19}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.UpsertGoogleTcpLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should create tcp load balancer if no infrastructure present.","size":138},{"name":"should update backend service if it exists","size":69},{"name":"should update health check if it exists","size":100}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.UpsertGoogleInternalLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should create Internal load balancer if no infrastructure present.","size":611},{"name":"should update backend service if it exists.","size":175},{"name":"should update health check if it exists.","size":123}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.DeleteGoogleInternalLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should delete an Internal Load Balancer with http health check","size":188},{"name":"should delete an Internal Load Balancer with https health check","size":364},{"name":"should delete an Internal Load Balancer with non-http(s) health check","size":12},{"name":"should delete a Internal Load Balancer with shared http health check","size":34},{"name":"should delete an Internal Load Balancer with shared http health check","size":65},{"name":"should fail to delete an Internal Load Balancer when forwarding rule can't be found","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.DeleteGoogleLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should delete a Network Load Balancer with health checks","size":341},{"name":"should delete a Network Load Balancer even if it lacks any health checks","size":5},{"name":"should fail to delete a Network Load Balancer that does not exist","size":3},{"name":"should fail if failed to delete a resource","size":87},{"name":"should fail if timed out while deleting a resource","size":118},{"name":"should wait on slow deletion of forwarding rule and successfully delete Network Load Balancer","size":28},{"name":"should retry deletion of target pool when 400/resourceNotReady is returned and should eventually succeed","size":11},{"name":"should retry deletion of target pool when 400/resourceNotReady is returned and should eventually give up","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.DeleteGoogleSslLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should delete ssl load balancer","size":626},{"name":"should fail to delete ssl load balancer that doesn't exist","size":2},{"name":"should fail to delete a ssl load balancer if we fail to delete a resource","size":10},{"name":"should fail if server group still attached","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.loadbalancer.UpsertGoogleHttpLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should create an HTTP Load Balancer with host rule, path matcher, path rules, etc with no existing infrastructure","size":1010},{"name":"should create an HTTP Load Balancer with minimal description","size":62},{"name":"should create an HTTPS Load Balancer when certificate specified","size":213},{"name":"should update health check when it exists and needs updated","size":194},{"name":"should update backend service if it exists and needs updated","size":47},{"name":"should update url map if it exists and needs updated","size":208}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.AbandonAndDecrementGoogleServerGroupAtomicOperationUnitSpec","children":[{"name":"should abandon instances[0]","size":169},{"name":"should abandon instances[1]","size":25}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.RebootGoogleInstancesAtomicOperationUnitSpec","children":[{"name":"should reset all instances","size":83},{"name":"should reset all known instances and fail on all unknown instances","size":11}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.RegisterInstancesWithGoogleLoadBalancerAtomicOperationUnitSpec","children":[{"name":"should register instances","size":15},{"name":"throws ResourceNotFound with unknown load balancer","size":23}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.CopyLastGoogleServerGroupAtomicOperationUnitSpec","children":[{"name":"operation builds description based on ancestor server group; overrides everything[0]","size":234},{"name":"operation builds description based on ancestor server group; overrides everything[1]","size":3},{"name":"operation builds description based on ancestor server group; overrides nothing","size":16},{"name":"operation builds description based on ancestor server group; overrides instanceMetadata and userData","size":12},{"name":"operation builds description based on ancestor server group; overrides userData","size":26}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.DisableGoogleServerGroupAtomicOperationUnitSpec","children":[{"name":"should remove instances and detach load balancers","size":266}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.TerminateGoogleInstancesAtomicOperationUnitSpec","children":[{"name":"should terminate instances without managed instance group","size":48},{"name":"should terminate all known instances and fail on all unknown instances without managed instance group","size":15},{"name":"should recreate instances with managed instance group","size":150}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.SerializeApplicationAtomicOperationUnitSpec","children":[{"name":"should serialize a server group","size":179},{"name":"should serialize a load balancer","size":7},{"name":"should serialize a security group","size":122},{"name":"should throw exception because server group has no instance template","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.UpsertGoogleSecurityGroupAtomicOperationUnitSpec","children":[{"name":"should insert new firewall rule with generated target tag","size":109},{"name":"should insert new firewall rule with specified target tag","size":6},{"name":"should update existing firewall rule and leave target tag unset","size":22},{"name":"should update existing firewall rule and set specified target tag","size":5},{"name":"should update existing firewall rule and override existing target tag with specified target tag","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.UpsertGoogleServerGroupTagsAtomicOperationUnitSpec","children":[{"name":"should set tags on new instance template and on instances","size":180},{"name":"should set tags on new instance template even if managed instance group has no instances","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.GoogleUserDataProviderSpec","children":[{"name":"combines common and custom user data[0]","size":39},{"name":"combines common and custom user data[1]","size":2},{"name":"combines common and custom user data[2]","size":1},{"name":"combines common and custom user data[3]","size":9},{"name":"combines common and custom user data[4]","size":2},{"name":"combines common and custom user data[5]","size":1},{"name":"combines common and custom user data[6]","size":1},{"name":"combines common and custom user data[7]","size":1},{"name":"combines common and custom user data[8]","size":1},{"name":"handles unreadable user data file[0]","size":1},{"name":"handles unreadable user data file[1]","size":1},{"name":"handles unreadable user data file[2]","size":133},{"name":"ensure replace tokens works[0]","size":2},{"name":"ensure replace tokens works[1]","size":1},{"name":"ensure replace tokens works[2]","size":1},{"name":"ensure replace tokens works[3]","size":2},{"name":"ensure replace tokens works[4]","size":1},{"name":"ensure replace tokens works[5]","size":1},{"name":"ensure replace tokens works[6]","size":2},{"name":"ensure replace tokens works[7]","size":1},{"name":"ensure replace tokens works[8]","size":2},{"name":"ensure replace tokens works[9]","size":1},{"name":"ensure replace tokens works[10]","size":1},{"name":"ensure replace tokens works[11]","size":1},{"name":"ensure replace tokens works[12]","size":0},{"name":"ensure replace tokens works[13]","size":1},{"name":"ensure replace tokens works[14]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.DestroyGoogleServerGroupAtomicOperationUnitSpec","children":[{"name":"should delete managed instance group","size":52},{"name":"should delete managed instance group and autoscaler if defined[0]","size":112},{"name":"should delete managed instance group and autoscaler if defined[1]","size":29},{"name":"should delete http loadbalancer backend if associated[0]","size":12},{"name":"should delete http loadbalancer backend if associated[1]","size":5},{"name":"should delete http loadbalancer backend if associated[2]","size":3},{"name":"should delete http loadbalancer backend if associated[3]","size":4},{"name":"should delete http loadbalancer backend if associated[4]","size":4},{"name":"should delete http loadbalancer backend if associated[5]","size":4},{"name":"should delete internal loadbalancer backend if associated[0]","size":133},{"name":"should delete internal loadbalancer backend if associated[1]","size":5},{"name":"should delete internal loadbalancer backend if associated[2]","size":2},{"name":"should delete internal loadbalancer backend if associated[3]","size":3},{"name":"should delete internal loadbalancer backend if associated[4]","size":2},{"name":"should delete internal loadbalancer backend if associated[5]","size":2},{"name":"should retry http backend deletion on 400, 412, socket timeout, succeed on 404[0]","size":21}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.ops.UpsertGoogleAutoscalingPolicyAtomicOperationUnitSpec","children":[{"name":"can create zonal and regional scaling policies[0]","size":163},{"name":"can create zonal and regional scaling policies[1]","size":19},{"name":"can update zonal and regional scaling policies[0]","size":149},{"name":"can update zonal and regional scaling policies[1]","size":17},{"name":"builds autoscaler based on ancestor autoscaling policy and input description: input overrides nothing[0]","size":46},{"name":"builds autoscaler based on ancestor autoscaling policy and input description: input overrides nothing[1]","size":9},{"name":"builds autoscaler based on ancestor autoscaling policy and input description; input overrides everything[0]","size":53},{"name":"builds autoscaler based on ancestor autoscaling policy and input description; input overrides everything[1]","size":6},{"name":"builds autoHealing policy based on ancestor autoHealing policy and input description; overrides everything","size":3},{"name":"builds autoHealing policy based on ancestor autoHealing policy and input description; overrides nothing","size":1},{"name":"if the input description's maxUnavailable is empty object, the resulting policy has no maxUnavailable property","size":1},{"name":"update the instance template when updatePolicyMetadata is called","size":10}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.AbandonAndDecrementGoogleServerGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":38},{"name":"invalid instanceIds fail validation","size":3},{"name":"null input fails validation","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.RegisterInstancesWithGoogleLoadBalancerDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":17},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.ModifyGoogleServerGroupInstanceTemplateDescriptionValidatorSpec","children":[{"name":"pass validation with minimum proper description inputs","size":17},{"name":"pass validation with all optional inputs","size":1},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.ResizeGoogleServerGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":6},{"name":"invalid targetSize fails validation","size":2},{"name":"null input fails validation","size":1},{"name":"uses capacity.desired instead of targetSize","size":1},{"name":"UpsertGoogleAutoscalingPolicyDescription is validated by UpsertGoogleAutoscalingPolicyDescriptionValidator","size":25}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.DisableGoogleServerGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":2},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.DestroyGoogleServerGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":2},{"name":"null input fails validation","size":29}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.UpsertGoogleSecurityGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":3},{"name":"pass validation without description, source ranges, source tags, allowed list and without target tags","size":1},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.StandardGceAttributeValidatorSpec","children":[{"name":"generic non-empty ok","size":1},{"name":"expect non-empty ok with numeric values[0]","size":0},{"name":"expect non-empty ok with numeric values[1]","size":1},{"name":"expect non-empty ok with numeric values[2]","size":0},{"name":"expect non-empty to fail with empty","size":0},{"name":"nonNegativeInt ok if non-negative","size":1},{"name":"nonNegativeInt invalid if negative","size":0},{"name":"valid generic name","size":1},{"name":"invalid generic name","size":0},{"name":"validate simple account name","size":0},{"name":"empty account name","size":1},{"name":"unknown account name","size":0},{"name":"valid server group name","size":0},{"name":"invalid server group name","size":1},{"name":"valid region name","size":5},{"name":"invalid region name","size":1},{"name":"valid zone name","size":5},{"name":"invalid zone name","size":1},{"name":"valid network name","size":1},{"name":"invalid network name","size":1},{"name":"valid image name","size":1},{"name":"invalid image name","size":1},{"name":"valid image artifact","size":1},{"name":"missing image artifact","size":1},{"name":"invalid image artifact type","size":0},{"name":"valid instance name","size":1},{"name":"invalid instance name","size":0},{"name":"valid instance type","size":0},{"name":"invalid instance type","size":1},{"name":"valid custom instance type","size":13},{"name":"invalid custom instance type","size":9},{"name":"valid name list","size":3},{"name":"invalid name list","size":2},{"name":"mixed valid/invalid name list","size":3},{"name":"valid instance ids","size":0},{"name":"invalid instance ids","size":1},{"name":"mixed valid/invalid instance ids","size":0},{"name":"valid in range exclusive","size":0},{"name":"invalid in range exclusive","size":0},{"name":"valid basic scaling policy","size":7},{"name":"valid complex scaling policy","size":5},{"name":"invalid autoscaler min, max or cooldown","size":1},{"name":"invalid autoscaler loadBalancingUtilization or cpuUtilization","size":0},{"name":"invalid autoscaler customMetricUtilizations","size":4},{"name":"valid autoHealer maxUnavailable with fixed=null and percent=0","size":4},{"name":"valid autoHealer maxUnavailable with fixed=null and percent=100","size":0},{"name":"valid autoHealer maxUnavailable with fixed=0 and percent=null","size":0},{"name":"valid autoHealer maxUnavailable with fixed=50 and percent=null","size":1},{"name":"valid autoHealer maxUnavailable with fixed=50 and percent=100","size":0},{"name":"valid autoHealer maxUnavailable with fixed=null and percent=100.25","size":1},{"name":"valid autoHealer maxUnavailable with fixed=50.25 and percent=null","size":1},{"name":"valid autoHealer maxUnavailable with fixed=50.25 and percent=100.25","size":0},{"name":"invalid autoHealer maxUnavailable","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.UpsertGoogleAutoscalingPolicyDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":3},{"name":"fail validation if neither autoscaling or autoHealing policy is set","size":0},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.EnableDisableGoogleServerGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":1},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.TerminateGoogleInstancesDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs without managed instance group","size":1},{"name":"pass validation with proper description inputs with managed instance group","size":1},{"name":"fail validation with managed instance group and no region","size":20},{"name":"fail validation without managed instance group and no zone","size":1},{"name":"invalid instanceIds fail validation","size":0},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.UpsertGoogleLoadBalancerDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":3},{"name":"pass validation without health checks and without IP protocol","size":1},{"name":"improper IP protocol fails validation","size":1},{"name":"null input fails validation","size":1},{"name":"pass validation with proper http description inputs","size":14},{"name":"pass validation with no host rules description inputs","size":9},{"name":"fail with improperly formatted ports","size":24},{"name":"fail if a backend service does not have a health check[0]","size":13},{"name":"fail if a backend service does not have a health check[1]","size":19},{"name":"fail if a backend service does not have a health check[2]","size":10},{"name":"(ssl) pass validation with proper description inputs","size":19},{"name":"(ssl) fail without a backend service","size":18},{"name":"(ssl) fail without a health check for the backend service","size":27},{"name":"(ssl) fail if port is not an integer","size":170},{"name":"(ssl) fail if port is not in the supported list","size":8},{"name":"(ssl) fail without a certificate","size":50},{"name":"(tcp) pass validation with proper description inputs","size":11},{"name":"(tcp) fail without a backend service","size":8},{"name":"(tcp) fail without a health check for the backend service","size":8},{"name":"(tcp) fail if port is not an integer","size":52},{"name":"(tcp) fail if port is not in the supported list","size":9}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.RebootGoogleInstancesDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":2},{"name":"invalid instanceIds fail validation","size":0},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.CopyLastGoogleServerGroupDescriptionValidatorSpec","children":[{"name":"pass validation with minimal description inputs","size":2},{"name":"pass validation with full description inputs","size":1},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.TerminateAndDecrementGoogleServerGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":3},{"name":"invalid instanceIds fail validation","size":0},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.UpsertGoogleImageTagsDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":5},{"name":"pass validation with empty tag map","size":0},{"name":"pass validation with empty tag value","size":1},{"name":"null tag map fails validation","size":0},{"name":"tag map containing empty key fails validation","size":1},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.DeleteGoogleLoadBalancerDescriptionValidatorSpec","children":[{"name":"pass validation with full description input","size":2},{"name":"pass validation with proper minimal description input","size":0},{"name":"fail validation with bad region","size":1},{"name":"null input fails validation","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.BasicGoogleDeployDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs[0]","size":4},{"name":"pass validation with proper description inputs[1]","size":1},{"name":"pass validation with proper description inputs[2]","size":1},{"name":"pass validation with proper description inputs and free-form details","size":1},{"name":"pass validation with proper description inputs and tags","size":0},{"name":"pass validation with proper description inputs, capacity override, and tags","size":4},{"name":"pass validation with proper description inputs and multiple persistent disks[0]","size":1},{"name":"pass validation with proper description inputs and multiple persistent disks[1]","size":1},{"name":"pass validation with proper description inputs and multiple persistent disks[2]","size":1},{"name":"pass validation with proper description inputs and multiple persistent disks[3]","size":1},{"name":"pass validation with proper description inputs and multiple persistent disks[4]","size":2},{"name":"invalid targetSize fails validation","size":1},{"name":"invalid capacity (min: -1, max: 0, desired: 0) fails validation","size":5},{"name":"invalid capacity (min: 0, max: -1, desired: 0) fails validation","size":2},{"name":"invalid capacity (min: 0, max: 0, desired: -1) fails validation","size":2},{"name":"invalid capacity (min: -1, max: -1, desired: -1) fails validation","size":1},{"name":"invalid capacity (min: null, max: 0, desired: 0) fails validation","size":1},{"name":"invalid capacity (min: 0, max: null, desired: 0) fails validation","size":1},{"name":"invalid capacity (min: 0, max: 0, desired: null) fails validation","size":2},{"name":"invalid capacity (min: null, max: null, desired: null) fails validation","size":2},{"name":"invalid disk sizeGb fails validation","size":4},{"name":"missing disk type fails validation","size":1},{"name":"invalid number of persistent disks fails validation","size":4},{"name":"source image specified directly on boot persistent disk fails validation","size":38},{"name":"missing source image on non-boot persistent disk fails validation","size":5},{"name":"invalid local ssd settings fails validation","size":9},{"name":"null input fails validation[0]","size":6},{"name":"null input fails validation[1]","size":1},{"name":"null input fails validation[2]","size":1},{"name":"nonsensical autoscaling policy min, max or cooldown fails validation","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.DeleteGoogleAutoscalingPolicyDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":1},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.CreateGoogleInstanceDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":7},{"name":"null input fails validation","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.DeleteGoogleSecurityGroupDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":1},{"name":"null input fails validation","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.DeregisterInstancesFromGoogleLoadBalancerDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":1},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.validators.UpsertGoogleServerGroupTagsDescriptionValidatorSpec","children":[{"name":"pass validation with proper description inputs","size":4},{"name":"pass validation with empty tag list","size":0},{"name":"pass validation with null tag list","size":1},{"name":"tag list containing empty item fails validation","size":1},{"name":"null input fails validation","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.google.deploy.handlers.BasicGoogleDeployHandlerSpec","children":[{"name":"handler supports basic deploy description type","size":0},{"name":"handler deploys with netflix specific naming convention","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.provider.agent.GoogleServerGroupCachingAgentSpec","children":[{"name":"should not set build info if no image description is found","size":46},{"name":"should not set build info if no relevant image description is found","size":22},{"name":"should set build host if image description contains appversion and build_host","size":210},{"name":"should sort disks so boot disk is first persistent disk[0]","size":3},{"name":"should sort disks so boot disk is first persistent disk[1]","size":0},{"name":"should sort disks so boot disk is first persistent disk[2]","size":3},{"name":"should sort disks so boot disk is first persistent disk[3]","size":0},{"name":"should sort disks so boot disk is first persistent disk[4]","size":0},{"name":"should sort disks so boot disk is first persistent disk[5]","size":1},{"name":"should sort disks so boot disk is first persistent disk[6]","size":0},{"name":"should sort disks so boot disk is first persistent disk[7]","size":0},{"name":"should sort disks so boot disk is first persistent disk[8]","size":1},{"name":"should sort disks so boot disk is first persistent disk[9]","size":0},{"name":"should sort disks so boot disk is first persistent disk[10]","size":0},{"name":"should sort disks so boot disk is first persistent disk[11]","size":1},{"name":"should sort disks so boot disk is first persistent disk[12]","size":0},{"name":"should sort disks so boot disk is first persistent disk[13]","size":0},{"name":"should sort disks so boot disk is first persistent disk[14]","size":0},{"name":"should sort disks so boot disk is first persistent disk[15]","size":0},{"name":"should sort disks so boot disk is first persistent disk[16]","size":0},{"name":"malformed instance properties shouldn't break disk sorting logic[0]","size":0},{"name":"malformed instance properties shouldn't break disk sorting logic[1]","size":0},{"name":"malformed instance properties shouldn't break disk sorting logic[2]","size":0},{"name":"malformed instance properties shouldn't break disk sorting logic[3]","size":0},{"name":"malformed instance properties shouldn't break disk sorting logic[4]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.provider.agent.GoogleImageCachingAgentSpec","children":[{"name":"public images with no deprecated struct are not filtered out","size":44},{"name":"project image lists are filtered for non-deprecated images","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.google.provider.agent.GoogleSecurityGroupCachingAgentSpec","children":[{"name":"should add security groups on initial run","size":187}]},{"name":"com.netflix.spinnaker.clouddriver.google.provider.view.GoogleSecurityGroupProviderSpec","children":[{"name":"getAll lists all","size":127},{"name":"getAllByRegion lists only those in supplied region","size":12},{"name":"getAllByAccount lists only those in supplied account[0]","size":8},{"name":"getAllByAccount lists only those in supplied account[1]","size":4},{"name":"getAllByAccountAndRegion lists only those in supplied account and region","size":7},{"name":"getAllByAccountAndName lists only those in supplied account with supplied name","size":5},{"name":"get returns match based on account, region, and name","size":57},{"name":"security group id and network id should be decorated with xpn host project id","size":65},{"name":"should add ipRangeRules with different protocols","size":22},{"name":"should group ipRangeRules by addressable range + protocol","size":8},{"name":"should turn exact ip address as source range into cidr range","size":10},{"name":"should turn exact port into port range","size":6},{"name":"should return no port ranges for protocol lacking a port","size":6},{"name":"should turn missing port for tcp or udp into full port range","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.google.provider.view.GoogleNetworkProviderSpec","children":[{"name":"getAll lists all and does not choke on deserializing routingConfig","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.google.GoogleExecutorTraitsSpec","children":[{"name":"increment success timer","size":109},{"name":"increment Exception failure timer","size":4},{"name":"increment generic failure timer and timers accumulate","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.google.model.callbacks.UtilsSpec","children":[{"name":"getImmutableCopy returns an immutable copy","size":19},{"name":"should get zone from instance URL","size":1},{"name":"should get target type from target proxy URL","size":1},{"name":"should get region from a full group Url","size":2},{"name":"should represent port range as a single port string if ports equal[0]","size":0},{"name":"should represent port range as a single port string if ports equal[1]","size":1},{"name":"should represent port range as a single port string if ports equal[2]","size":0},{"name":"should return health check type from full url","size":0},{"name":"should decorate xpn resource id[0]","size":0},{"name":"should decorate xpn resource id[1]","size":0},{"name":"should decorate xpn resource id[2]","size":0},{"name":"should decorate xpn resource id[3]","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.google.controllers.GoogleNamedImageLookupControllerSpec","children":[{"name":"should extract tags from query parameters","size":84},{"name":"should support filtering on 1..* tags","size":9},{"name":"should build tags map from description and labels[0]","size":3},{"name":"should build tags map from description and labels[1]","size":0},{"name":"should build tags map from description and labels[2]","size":0},{"name":"should build tags map from description and labels[3]","size":0},{"name":"should build tags map from description and labels[4]","size":0},{"name":"should build tags map from description and labels[5]","size":0},{"name":"should build tags map from description and labels[6]","size":0},{"name":"should build tags map from description and labels[7]","size":0},{"name":"should build tags map from description and labels[8]","size":0},{"name":"should build tags map from description and labels[9]","size":0},{"name":"should build tags map from description and labels[10]","size":0}]}]},{"name":"clouddriver-ecs","children":[{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.TaskCacheClientTest","children":[{"name":"shouldConvert","size":230}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.IamRoleCacheClientTest","children":[{"name":"shouldConvert","size":456}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.ServiceCacheClientTest","children":[{"name":"shouldConvert","size":311}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.ContainerInstanceCacheClientTest","children":[{"name":"shouldConvert","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.EcsClusterCacheClientTest","children":[{"name":"shouldConvert","size":20}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.TaskDefinitionCacheClientTest","children":[{"name":"shouldConvert","size":363}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.security.EcsAccountBuilderTest","children":[{"name":"shouldBuildAccount","size":197}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.TaskDefinitionCacheTest","children":[{"name":"shouldRetrieveFromWrittenCache","size":192}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.TaskCachingAgentTest","children":[{"name":"shouldGetListOfTasks","size":4},{"name":"shouldGenerateFreshData","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.ContainerInstanceCachingAgentTest","children":[{"name":"shouldGetListOfContainerInstances","size":2},{"name":"shouldGenerateFreshData","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.ServiceCacheTest","children":[{"name":"shouldRetrieveFromWrittenCache","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.TaskDefinitionCachingAgentTest","children":[{"name":"shouldGetListOfTaskDefinitions","size":1},{"name":"shouldGenerateFreshData","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.EcsClusterCacheTest","children":[{"name":"shouldRetrieveFromWrittenCache","size":3}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.TaskCacheTest","children":[{"name":"shouldRetrieveFromWrittenCache","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.IamRoleCachingAgentTest","children":[{"name":"shouldGetListOfServices","size":2},{"name":"shouldGenerateFreshData","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.ContainerInstanceCacheTest","children":[{"name":"shouldRetrieveFromWrittenCache","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.ServiceCachingAgentTest","children":[{"name":"shouldGetListOfServices","size":1},{"name":"shouldGenerateFreshData","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.IamRoleCacheTest","children":[{"name":"shouldRetrieveFromWrittenCache","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.EcsClusterCachingAgentTest","children":[{"name":"shouldGetListOfArns","size":0},{"name":"shouldAddToCache","size":1},{"name":"shouldGenerateFreshData","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.SecretCacheClientSpec","children":[{"name":"should convert","size":324}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.EcsLoadbalancerCacheClientSpec","children":[{"name":"should convert cache data into object","size":608}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.EcsInstanceCacheClientSpec","children":[{"name":"should convert into an object","size":169}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.TaskHealthCacheClientSpec","children":[{"name":"should convert","size":83}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.EcsTargetGroupCacheClientSpec","children":[{"name":"should convert cache data into object","size":32}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.ScalableTargetCacheClientSpec","children":[{"name":"should convert cache data into object","size":30}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.EcsCloudWatchAlarmCacheClientSpec","children":[{"name":"should convert cache data into object","size":73}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.cache.KeysSpec","children":[{"name":"should parse a given key properly","size":81},{"name":"should parse a given iam role key properly","size":1},{"name":"should generate the proper iam role key","size":1},{"name":"should generate the proper task key","size":1},{"name":"should generate the proper service key","size":2},{"name":"should generate the proper cluster key","size":1},{"name":"should generate the proper container instance key","size":1},{"name":"should generate the proper task definition key","size":0},{"name":"should generate the proper task health key","size":2},{"name":"should generate the proper scalable target key","size":1},{"name":"should generate the proper secret key","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.converters.DisableServiceAtomicOperationConverterSpec","children":[{"name":"should convert","size":362}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.converters.DestroyServiceAtomicOperationConverterSpec","children":[{"name":"should convert","size":17}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.converters.ResizeServiceAtomicOperationConverterSpec","children":[{"name":"should convert","size":105}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.converters.EnableServiceAtomicOperationConverterSpec","children":[{"name":"should convert","size":70}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.converters.EcsCreateServerGroupAtomicOperationConverterSpec","children":[{"name":"should convert","size":118}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.converters.TerminateInstanceAtomicOperationConverterSpec","children":[{"name":"should convert","size":39}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.ops.DisableServiceAtomicOperationSpec","children":[{"name":"should execute the operation","size":649}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.ops.DestroyServiceAtomicOperationSpec","children":[{"name":"should execute the operation","size":127}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.ops.CreateServerGroupAtomicOperationSpec","children":[{"name":"should create a service","size":672},{"name":"should create a service using VPC and Fargate mode","size":53},{"name":"should create default Docker labels","size":84},{"name":"should create custom Docker labels","size":44},{"name":"should not allow overwriting Spinnaker Docker labels","size":5},{"name":"should allow selecting the logDriver","size":9},{"name":"should allow empty logOptions","size":2},{"name":"should allow registering logOptions","size":3},{"name":"should allow using secret credentials for the docker image","size":5},{"name":"should allow not specifying secret credentials for the docker image","size":1},{"name":"should generate a RegisterTaskDefinitionRequest object","size":37},{"name":"should set additional environment variables","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.ops.EnableServiceAtomicOperationSpec","children":[{"name":"should execute the operation","size":37}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.ops.TerminateInstanceAtomicOperationSpec","children":[{"name":"should execute the operation","size":19}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.ops.ResizeServiceAtomicOperationSpec","children":[{"name":"should execute the operation","size":22}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.validators.EcsCreateServergroupDescriptionValidatorSpec","children":[{"name":"should fail an incorrect region","size":59},{"name":"should fail when required properties are null","size":22},{"name":"should fail when a property is invalid","size":49},{"name":"should pass validation","size":7},{"name":"should fail when the capacity is null","size":7},{"name":"should fail when desired is greater than max","size":7},{"name":"should fail when desired is less than min","size":6},{"name":"should fail when more than one availability zones is present","size":6},{"name":"should fail when environment variables contain reserved key","size":5},{"name":"should pass with correct environment variables","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.validators.TerminateInstanceDescriptionValidatorSpec","children":[{"name":"should fail an incorrect region","size":81},{"name":"should fail when required properties are null","size":11},{"name":"should fail when a property is invalid","size":11},{"name":"should pass validation","size":9}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.validators.ResizeDescriptionValidatorSpec","children":[{"name":"should fail an incorrect region","size":20},{"name":"should fail when required properties are null","size":8},{"name":"should fail when a property is invalid","size":8},{"name":"should pass validation","size":123},{"name":"should fail when capacity is null","size":8},{"name":"should fail when desired is greater than max","size":54},{"name":"should fail when desired is less than min","size":12}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.deploy.validators.ServerGroupDescriptionValidatorSpec","children":[{"name":"should fail an incorrect region","size":74},{"name":"should fail when required properties are null","size":7},{"name":"should fail when a property is invalid","size":12},{"name":"should pass validation","size":15}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.TaskHealthCachingAgentSpec","children":[{"name":"should get a list of task definitions","size":153},{"name":"should generate fresh data","size":15}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.ScalableTargetCachingAgentSpec","children":[{"name":"should get a list of cloud watch alarms","size":97},{"name":"should generate fresh data","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.SecretCachingAgentSpec","children":[{"name":"should get a list of secrets","size":95},{"name":"should generate fresh data","size":39}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.TaskHealthCacheSpec","children":[{"name":"should retrieve from written cache","size":20}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.agent.EcsCloudMetricAlarmCachingAgentSpec","children":[{"name":"should get a list of cloud watch alarms","size":21},{"name":"should generate fresh data","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcsAccountMapperSpec","children":[{"name":"should map an AWS account to its ECS account","size":156}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcsLoadBalancerProviderSpec","children":[{"name":"should retrieve an empty list","size":21},{"name":"should retrieve a list containing load balancers","size":61}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcsClusterProviderSpec","children":[{"name":"should get no clusters","size":5},{"name":"should get a cluster","size":13},{"name":"should get multiple clusters","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcsSecretProviderSpec","children":[{"name":"should get no secrets","size":8},{"name":"should get a secret","size":1},{"name":"should get multiple secrets","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcrImageProviderSpec","children":[{"name":"should the handle url","size":34},{"name":"should not the handle url","size":1},{"name":"should retrieve image details based on tagged url","size":172},{"name":"should retrieve image details based on digest url","size":5},{"name":"should throw exception due to malformed account","size":13},{"name":"should throw exception due to missing repository name","size":1},{"name":"should throw exception due to malformed region","size":1},{"name":"should throw exception due to invalid region","size":6},{"name":"should find the image in a repository with a large number of images","size":45}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcsRoleProviderSpec","children":[{"name":"should return IAM roles","size":24}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcsServerClusterProviderSpec","children":[{"name":"should produce an ecs cluster","size":146},{"name":"should produce an ecs cluster with VPC network configuration","size":5},{"name":"should produce an ecs cluster using Fargate","size":6},{"name":"should produce an ecs cluster with unknown VPC","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.provider.view.EcsCloudMetricProviderSpec","children":[{"name":"should get metric alarms","size":7}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.view.EcsInstanceProviderSpec","children":[{"name":"should return an EcsTask","size":496}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.view.EcrImageProviderSpec","children":[{"name":"shouldHandleEcrRepositoryUrl","size":0},{"name":"shouldNotHandleNonEcrRepositoryUrl","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.view.UnvalidatedDockerImageProviderSpec","children":[{"name":"shouldNotHandleEcrRepositoryUrl","size":4},{"name":"shouldHandleNonEcrRepositoryUrl","size":1}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.view.EcsApplicationProviderSpec","children":[{"name":"should return an application","size":33}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.controllers.EcsImagesControllerSpec","children":[{"name":"should retrieve image details based on tagged url","size":23}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.controllers.servergroup.ServerGroupEventStatusConverterSpec","children":[{"name":"should infer successful status on successful messages","size":16},{"name":"should infer failed status when no container instances are available in a cluster","size":1},{"name":"should infer failed status when there is insufficient capacity in the cluster","size":0},{"name":"should infer transition status when there a task is registered on a target group","size":0},{"name":"should infer transition status when a task is started","size":1},{"name":"should infer transition status when there a task is unregistered","size":0},{"name":"should infer transition status when tasks begin draining","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.controllers.EcsCloudMetricControllerSpec","children":[{"name":"should get a map of metrics","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.controllers.EcsClusterControllerSpec","children":[{"name":"should retrieve a collection of ECS clusters","size":10}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.controllers.EcsSecretControllerSpec","children":[{"name":"should retrieve a collection of secrets","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.services.ContainerInformationServiceSpec","children":[{"name":"should return a proper health status","size":14},{"name":"should return a unknown health status when the service cache is null","size":1},{"name":"should return a unknown health status when the task cache is null","size":1},{"name":"should throw an exception when the service has multiple loadbalancers","size":0},{"name":"should return a proper private address for a task","size":2},{"name":"should return a null when port is out of range","size":0},{"name":"should return a unknown when there is no container instance for the task","size":1},{"name":"should return a unknown when there is no ec2 instance for the container","size":1},{"name":"should throw an exception when task has multiple containers","size":1},{"name":"should throw an exception when container has multiple ec2 instances","size":0},{"name":"should return the zone of the container instance for a task","size":2},{"name":"should return null when there is no container instance for the task","size":1},{"name":"should return a cluster name","size":1},{"name":"should return a cluster arn","size":1},{"name":"should return an ec2 instance","size":2},{"name":"should return an null when getting ec2 instance without a container instance","size":1},{"name":"should return an when no ec2 instances are cached","size":1},{"name":"should throw an exception when multiple ec2 instances are found for one id","size":3},{"name":"should return an aws account name","size":2},{"name":"should return an null when no aws account is found associated to the ecs account","size":0}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.services.SubnetSelectorSpec","children":[{"name":"should find the right subnet","size":108},{"name":"should return the right VPC IDs","size":21}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.services.EcsCloudMetricServiceSpec","children":[{"name":"should delete metric alarms","size":8}]},{"name":"com.netflix.spinnaker.clouddriver.ecs.services.SecurityGroupSelectorSpec","children":[{"name":"should find the right sg","size":22}]}]},{"name":"clouddriver-web","children":[{"name":"com.netflix.spinnaker.clouddriver.requestqueue.pooled.RequestDistributorSpec","children":[{"name":"should pop and dispatch one item per queue","size":1024}]},{"name":"com.netflix.spinnaker.clouddriver.requestqueue.pooled.PooledRequestQueueSpec","children":[{"name":"should execute requests","size":35},{"name":"should time out if request does not complete","size":19},{"name":"should time out if request does not start in time","size":30}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.OperationsControllerSpec","children":[{"name":"controller takes many operation descriptions, resolves them from the spring context, and executes them in order","size":3126},{"name":"should only pre-process inputs of supported description classes[0]","size":7},{"name":"should only pre-process inputs of supported description classes[1]","size":18},{"name":"should only pre-process inputs of supported description classes[2]","size":5}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.SearchControllerSpec","children":[{"name":"query all search providers","size":126},{"name":"should not fail all searches if any provider fail","size":23},{"name":"filter search providers by platform","size":160},{"name":"search on type if provided","size":8},{"name":"if only one search provider, don't aggregate into an aws result","size":4}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.CloudMetricControllerSpec","children":[{"name":"getStatistics sends defaults for start/end time","size":56},{"name":"getStatistics removes startTime/endTime fields from filters if present","size":6}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.AuthorizationSupportSpec","children":[{"name":"filter LoadBalancerProvider.Item","size":194},{"name":"filter LoadBalancerProvider.Items","size":10},{"name":"filter list items","size":16}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.ClusterControllerSpec","children":[{"name":"should call all application providers to get and merge the cluster names","size":67},{"name":"should throw exception when looking for specific cluster that doesnt exist","size":29},{"name":"should return specific named serverGroup","size":192},{"name":"should throw exception when no clusters are found for an account","size":5},{"name":"should throw exception when a requested cluster is not found within an account","size":1},{"name":"should return the server group for the 'north:newest' target","size":138},{"name":"should return the server group for the 'north:current' target","size":8},{"name":"should return the server group for the 'north:current_asg' target","size":6},{"name":"should return the server group for the 'north:current_asg_dynamic' target","size":13},{"name":"should return the server group for the 'north:previous' target","size":5},{"name":"should return the server group for the 'north:oldest' target","size":10},{"name":"should return the server group for the 'north:largest' target","size":9},{"name":"should return the server group for the 'south:current' target","size":4},{"name":"should return the server group for the 'south:previous' target","size":6},{"name":"should return the server group for the 'south:oldest' target","size":4},{"name":"should return the server group for the 'south:oldest' target","size":4},{"name":"should return the server group for the 'south:largest' target","size":6},{"name":"should return the server group for the 'south:fail' target","size":5},{"name":"should return the server group for the 'abc:current' target","size":5},{"name":"should get ImageSummary from serverGroup","size":21}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.CredentialsControllerSpec","children":[{"name":"named credential names are listed","size":293}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.DataControllerSpec","children":[{"name":"should verify access to account when fetching static data","size":35},{"name":"should verify access to account when fetching adhoc data","size":20}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.ApplicationControllerSpec","children":[{"name":"call all application providers on listing","size":12},{"name":"merge clusterNames and attributes when multiple apps are found","size":53},{"name":"prune nulls when subset of application providers find app","size":6},{"name":"throw NotFoundException when no apps are found","size":1},{"name":"provide cloudProviders field correctly based on clusters[0]","size":6},{"name":"provide cloudProviders field correctly based on clusters[1]","size":2}]},{"name":"com.netflix.spinnaker.clouddriver.controllers.FeaturesControllerSpec","children":[{"name":"should favor @Operation over @Component when determining stage names","size":49}]}]}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment