Last active
November 8, 2018 06:00
-
-
Save jkschneider/8b0e28bcc81081ce0464514d53d497ac to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"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