1/*
2Copyright 2017 WALLIX
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package console
18
19import (
20	"github.com/fatih/color"
21	"github.com/wallix/awless/cloud"
22	"github.com/wallix/awless/cloud/properties"
23)
24
25var ColumnsInListing = map[string][]string{
26	cloud.Instance:            {properties.ID, properties.AvailabilityZone, properties.Name, properties.State, properties.Type, properties.PublicIP, properties.PrivateIP, properties.Launched, properties.KeyPair},
27	cloud.Vpc:                 {properties.ID, properties.Name, properties.Default, properties.State, properties.CIDR},
28	cloud.Subnet:              {properties.ID, properties.Name, properties.CIDR, properties.AvailabilityZone, properties.Default, properties.Vpc, properties.Public, properties.State},
29	cloud.SecurityGroup:       {properties.ID, properties.Vpc, properties.InboundRules, properties.OutboundRules, properties.Name, properties.Description},
30	cloud.InternetGateway:     {properties.ID, properties.Name, properties.Vpcs},
31	cloud.NatGateway:          {properties.ID, properties.State, properties.Vpc, properties.Subnet, properties.Created},
32	cloud.RouteTable:          {properties.ID, properties.Name, properties.Vpc, properties.Default, properties.Routes, properties.Associations},
33	cloud.Keypair:             {properties.ID, properties.Fingerprint},
34	cloud.Image:               {properties.ID, properties.Name, properties.State, properties.Location, properties.Public, properties.Type, properties.Created, properties.Architecture, properties.Hypervisor, properties.Virtualization},
35	cloud.ImportImageTask:     {properties.ID, properties.Description, properties.Image, properties.Progress, properties.State, properties.StateMessage},
36	cloud.Volume:              {properties.ID, properties.Name, properties.Type, properties.State, properties.Size, properties.Encrypted, properties.Created, properties.AvailabilityZone, properties.Instances},
37	cloud.AvailabilityZone:    {properties.Name, properties.State, properties.Region, properties.Messages},
38	cloud.ElasticIP:           {properties.ID, properties.PublicIP, properties.PrivateIP, properties.Association},
39	cloud.Snapshot:            {properties.ID, properties.Volume, properties.Encrypted, properties.Owner, properties.State, properties.Progress, properties.Created, properties.Size},
40	cloud.NetworkInterface:    {properties.ID, properties.Vpc, properties.Subnet, properties.State, properties.Instance, properties.PrivateIP, properties.PublicIP, properties.Description},
41	cloud.LoadBalancer:        {properties.Name, properties.Vpc, properties.State, properties.PublicDNS, properties.Created, properties.Scheme},
42	cloud.ClassicLoadBalancer: {properties.Name, properties.Vpc, properties.PublicDNS, properties.Instances, properties.Ports, properties.Created, properties.Scheme},
43	cloud.TargetGroup:         {properties.Name, properties.Vpc, properties.CheckHTTPCode, properties.Port, properties.Protocol, properties.CheckInterval, properties.CheckPath, properties.CheckPort, properties.CheckProtocol},
44	cloud.Listener:            {properties.ID, properties.Protocol, properties.Port, properties.LoadBalancer, properties.TargetGroups, properties.AlarmActions},
45	cloud.Database:            {properties.ID, properties.Name, properties.AvailabilityZone, properties.Class, properties.State, properties.Storage, properties.Port, properties.Username, properties.Public, properties.ReplicaOf, properties.Engine, properties.EngineVersion, properties.Created},
46	cloud.DbSubnetGroup:       {properties.ID, properties.State, properties.Vpc, properties.Subnets, properties.Description},
47	cloud.LaunchConfiguration: {properties.Name, properties.Type, properties.Created, properties.KeyPair},
48	cloud.ScalingGroup:        {properties.Name, properties.LaunchConfigurationName, properties.DesiredCapacity, properties.State, properties.Created, properties.NewInstancesProtected},
49	cloud.ScalingPolicy:       {properties.Name, properties.Type, properties.ScalingGroupName, properties.AlarmNames, properties.AdjustmentType, properties.ScalingAdjustment},
50	cloud.Repository:          {properties.Name, properties.URI, properties.Created, properties.Account, properties.Arn},
51	cloud.ContainerCluster:    {properties.Name, properties.State, properties.ActiveServicesCount, properties.PendingTasksCount, properties.RegisteredContainerInstancesCount, properties.RunningTasksCount},
52	cloud.ContainerTask:       {properties.Name, properties.Version, properties.State, properties.ContainersImages, properties.Deployments},
53	cloud.Container:           {properties.Name, properties.DeploymentName, properties.State, properties.Created, properties.Launched, properties.Stopped, properties.Cluster, properties.ContainerTask},
54	cloud.ContainerInstance:   {properties.ID, properties.Instance, properties.Cluster, properties.State, properties.RunningTasksCount, properties.PendingTasksCount, properties.Created, properties.AgentConnected},
55	cloud.Certificate:         {properties.Arn, properties.Name},
56	cloud.User:                {properties.ID, properties.Name, properties.PasswordLastUsed, properties.Created},
57	cloud.Role:                {properties.ID, properties.Name, properties.Created},
58	cloud.InstanceProfile:     {properties.ID, properties.Name, properties.Path, properties.Created},
59	cloud.Policy:              {properties.ID, properties.Name, properties.Type, properties.Created, properties.Updated, properties.Attached},
60	cloud.Group:               {properties.ID, properties.Name, properties.Created},
61	cloud.AccessKey:           {properties.ID, properties.State, properties.Username, properties.Created},
62	cloud.MFADevice:           {properties.ID, properties.AttachedAt},
63	cloud.Bucket:              {properties.ID, properties.Grants, properties.Created},
64	cloud.S3Object:            {properties.ID, properties.Bucket, properties.Modified, properties.Owner, properties.Size, properties.Class},
65	cloud.Subscription:        {properties.Arn, properties.Topic, properties.Endpoint, properties.Protocol, properties.Owner},
66	cloud.Topic:               {properties.ID},
67	cloud.Queue:               {properties.ID, properties.ApproximateMessageCount, properties.Created, properties.Modified, properties.Delay},
68	cloud.Zone:                {properties.ID, properties.Name, properties.Comment, properties.Private, properties.RecordCount, properties.CallerReference},
69	cloud.Record:              {properties.ID, properties.Type, properties.Name, properties.Records, properties.Zone, properties.Alias, properties.TTL},
70	cloud.Function:            {properties.Name, properties.Size, properties.Memory, properties.Runtime, properties.Version, properties.Modified, properties.Description},
71	cloud.Metric:              {properties.ID, properties.Name, properties.Namespace, properties.Dimensions},
72	cloud.Alarm:               {properties.Name, properties.Namespace, properties.MetricName, properties.Description, properties.State, properties.Updated, properties.Dimensions},
73	cloud.Distribution:        {properties.ID, properties.PublicDNS, properties.Enabled, properties.State, properties.Modified, properties.Aliases, properties.SSLSupportMethod, properties.Origins},
74	cloud.Stack:               {properties.ID, properties.Name, properties.State, properties.Created, properties.Modified},
75}
76
77var DefaultsColumnDefinitions = map[string][]ColumnDefinition{
78	//EC2
79	cloud.Instance: {
80		StringColumnDefinition{Prop: properties.ID},
81		StringColumnDefinition{Prop: properties.AvailabilityZone, Friendly: "Zone"},
82		StringColumnDefinition{Prop: properties.Name},
83		ColoredValueColumnDefinition{
84			StringColumnDefinition: StringColumnDefinition{Prop: properties.State},
85			ColoredValues:          map[string]color.Attribute{"running": color.FgGreen, "stopped": color.FgRed},
86		},
87		StringColumnDefinition{Prop: properties.Type},
88		StringColumnDefinition{Prop: properties.PublicIP, Friendly: "Public IP"},
89		StringColumnDefinition{Prop: properties.PrivateIP, Friendly: "Private IP"},
90		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Launched, Friendly: "Uptime"}},
91		StringColumnDefinition{Prop: properties.KeyPair},
92	},
93	cloud.Vpc: {
94		StringColumnDefinition{Prop: properties.ID},
95		StringColumnDefinition{Prop: properties.Name},
96		ColoredValueColumnDefinition{
97			StringColumnDefinition: StringColumnDefinition{Prop: properties.Default, Friendly: "Default"},
98			ColoredValues:          map[string]color.Attribute{"true": color.FgGreen},
99		},
100		StringColumnDefinition{Prop: properties.State},
101		StringColumnDefinition{Prop: properties.CIDR},
102	},
103	cloud.Subnet: {
104		StringColumnDefinition{Prop: properties.ID},
105		StringColumnDefinition{Prop: properties.Name},
106		StringColumnDefinition{Prop: properties.CIDR},
107		StringColumnDefinition{Prop: properties.AvailabilityZone, Friendly: "Zone"},
108		ColoredValueColumnDefinition{
109			StringColumnDefinition: StringColumnDefinition{Prop: properties.Default, Friendly: "Default"},
110			ColoredValues:          map[string]color.Attribute{"true": color.FgGreen},
111		},
112		StringColumnDefinition{Prop: properties.Vpc},
113		ColoredValueColumnDefinition{
114			StringColumnDefinition: StringColumnDefinition{Prop: properties.Public},
115			ColoredValues:          map[string]color.Attribute{"true": color.FgYellow}},
116		ColoredValueColumnDefinition{
117			StringColumnDefinition: StringColumnDefinition{Prop: properties.State},
118			ColoredValues:          map[string]color.Attribute{"available": color.FgGreen}},
119	},
120	cloud.SecurityGroup: {
121		StringColumnDefinition{Prop: properties.ID},
122		StringColumnDefinition{Prop: properties.Vpc},
123		FirewallRulesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.InboundRules, Friendly: "Inbound"}},
124		FirewallRulesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.OutboundRules, Friendly: "Outbound"}},
125		StringColumnDefinition{Prop: properties.Name},
126		StringColumnDefinition{Prop: properties.Description},
127	},
128	cloud.InternetGateway: {
129		StringColumnDefinition{Prop: properties.ID},
130		StringColumnDefinition{Prop: properties.Name},
131		StringColumnDefinition{Prop: properties.Vpcs},
132	},
133	cloud.NatGateway: {
134		StringColumnDefinition{Prop: properties.ID},
135		StringColumnDefinition{Prop: properties.State},
136		StringColumnDefinition{Prop: properties.Vpc},
137		StringColumnDefinition{Prop: properties.Subnet},
138		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created, Friendly: "Created"}},
139	},
140	cloud.RouteTable: {
141		StringColumnDefinition{Prop: properties.ID},
142		StringColumnDefinition{Prop: properties.Name},
143		StringColumnDefinition{Prop: properties.Vpc},
144		ColoredValueColumnDefinition{
145			StringColumnDefinition: StringColumnDefinition{Prop: properties.Default},
146			ColoredValues:          map[string]color.Attribute{"true": color.FgGreen},
147		},
148		RoutesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Routes}},
149		KeyValuesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Associations}},
150	},
151	cloud.Keypair: {
152		StringColumnDefinition{Prop: properties.ID},
153		StringColumnDefinition{Prop: properties.Fingerprint},
154	},
155	cloud.Image: {
156		StringColumnDefinition{Prop: properties.ID},
157		StringColumnDefinition{Prop: properties.Name},
158		StringColumnDefinition{Prop: properties.State},
159		StringColumnDefinition{Prop: properties.Location},
160		StringColumnDefinition{Prop: properties.Public},
161		StringColumnDefinition{Prop: properties.Type},
162		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created, Friendly: "Created"}},
163		StringColumnDefinition{Prop: properties.Architecture, Friendly: "Arch"},
164		StringColumnDefinition{Prop: properties.Hypervisor, Friendly: "Hyperv"},
165		StringColumnDefinition{Prop: properties.Virtualization, Friendly: "Virt"},
166	},
167	cloud.ImportImageTask: {
168		StringColumnDefinition{Prop: properties.ID},
169		StringColumnDefinition{Prop: properties.Description},
170		StringColumnDefinition{Prop: properties.Image},
171		StringColumnDefinition{Prop: properties.Progress},
172		StringColumnDefinition{Prop: properties.State},
173		StringColumnDefinition{Prop: properties.StateMessage},
174	},
175	cloud.Volume: {
176		StringColumnDefinition{Prop: properties.ID},
177		StringColumnDefinition{Prop: properties.Name},
178		StringColumnDefinition{Prop: properties.Type},
179		StringColumnDefinition{Prop: properties.State},
180		StorageColumnDefinition{Unit: gb, StringColumnDefinition: StringColumnDefinition{Prop: properties.Size}},
181		StringColumnDefinition{Prop: properties.Encrypted},
182		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
183		StringColumnDefinition{Prop: properties.AvailabilityZone, Friendly: "Zone"},
184		StringColumnDefinition{Prop: properties.Instances},
185	},
186	cloud.AvailabilityZone: {
187		StringColumnDefinition{Prop: properties.Name},
188		StringColumnDefinition{Prop: properties.State},
189		StringColumnDefinition{Prop: properties.Region},
190		StringColumnDefinition{Prop: properties.Messages},
191	},
192	cloud.ElasticIP: {
193		StringColumnDefinition{Prop: properties.ID},
194		StringColumnDefinition{Prop: properties.PublicIP},
195		StringColumnDefinition{Prop: properties.PrivateIP},
196		StringColumnDefinition{Prop: properties.Association},
197	},
198	cloud.Snapshot: {
199		StringColumnDefinition{Prop: properties.ID},
200		StringColumnDefinition{Prop: properties.Volume},
201		StringColumnDefinition{Prop: properties.Encrypted},
202		StringColumnDefinition{Prop: properties.Owner},
203		StringColumnDefinition{Prop: properties.State},
204		StringColumnDefinition{Prop: properties.Progress},
205		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
206		StorageColumnDefinition{Unit: gb, StringColumnDefinition: StringColumnDefinition{Prop: properties.Size}},
207	},
208	cloud.NetworkInterface: {
209		StringColumnDefinition{Prop: properties.ID},
210		StringColumnDefinition{Prop: properties.Vpc},
211		StringColumnDefinition{Prop: properties.Subnet},
212		StringColumnDefinition{Prop: properties.State},
213		StringColumnDefinition{Prop: properties.Instance},
214		StringColumnDefinition{Prop: properties.PrivateIP},
215		StringColumnDefinition{Prop: properties.PublicIP},
216		StringColumnDefinition{Prop: properties.Description},
217	},
218	// Loadbalancer
219	cloud.LoadBalancer: {
220		StringColumnDefinition{Prop: properties.Name},
221		StringColumnDefinition{Prop: properties.Vpc},
222		StringColumnDefinition{Prop: properties.State},
223		StringColumnDefinition{Prop: properties.PublicDNS},
224		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created, Friendly: "Created"}},
225		StringColumnDefinition{Prop: properties.Scheme},
226	},
227	cloud.ClassicLoadBalancer: {
228		StringColumnDefinition{Prop: properties.Name},
229		StringColumnDefinition{Prop: properties.Vpc},
230		StringColumnDefinition{Prop: properties.PublicDNS},
231		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created, Friendly: "Created"}},
232		StringColumnDefinition{Prop: properties.Scheme},
233		SliceColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Instances}},
234		SliceColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Ports}},
235	},
236	cloud.TargetGroup: {
237		StringColumnDefinition{Prop: properties.Name},
238		StringColumnDefinition{Prop: properties.Vpc},
239		StringColumnDefinition{Prop: properties.CheckHTTPCode},
240		StringColumnDefinition{Prop: properties.Port},
241		StringColumnDefinition{Prop: properties.Protocol},
242		StringColumnDefinition{Prop: properties.CheckInterval, Friendly: "HCInterval"},
243		StringColumnDefinition{Prop: properties.CheckPath, Friendly: "HCPath"},
244		StringColumnDefinition{Prop: properties.CheckPort, Friendly: "HCPort"},
245		StringColumnDefinition{Prop: properties.CheckProtocol, Friendly: "HCProtocol"},
246	},
247	cloud.Listener: {
248		StringColumnDefinition{Prop: properties.ID},
249		StringColumnDefinition{Prop: properties.Port},
250		StringColumnDefinition{Prop: properties.Protocol},
251		StringColumnDefinition{Prop: properties.LoadBalancer},
252		SliceColumnDefinition{ForEach: ToShortArn, StringColumnDefinition: StringColumnDefinition{Prop: properties.TargetGroups}},
253		StringColumnDefinition{Prop: properties.AlarmActions},
254	},
255	// Database
256	cloud.Database: {
257		StringColumnDefinition{Prop: properties.ID},
258		StringColumnDefinition{Prop: properties.Name},
259		StringColumnDefinition{Prop: properties.AvailabilityZone, Friendly: "Zone"},
260		StringColumnDefinition{Prop: properties.Zone, Friendly: "HostedZone"},
261		StringColumnDefinition{Prop: properties.Class},
262		ColoredValueColumnDefinition{
263			StringColumnDefinition: StringColumnDefinition{Prop: properties.State},
264			ColoredValues:          map[string]color.Attribute{"available": color.FgGreen}},
265		StorageColumnDefinition{Unit: gb, StringColumnDefinition: StringColumnDefinition{Prop: properties.Storage}},
266		StringColumnDefinition{Prop: properties.Port},
267		StringColumnDefinition{Prop: properties.Username},
268		ColoredValueColumnDefinition{
269			StringColumnDefinition: StringColumnDefinition{Prop: properties.Public},
270			ColoredValues:          map[string]color.Attribute{"true": color.FgYellow}},
271		StringColumnDefinition{Prop: properties.ReplicaOf, Friendly: "Replica Of"},
272		StringColumnDefinition{Prop: properties.Engine},
273		StringColumnDefinition{Prop: properties.EngineVersion, Friendly: "Version"},
274		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created, Friendly: "Created"}},
275	},
276	cloud.DbSubnetGroup: {
277		StringColumnDefinition{Prop: properties.ID},
278		StringColumnDefinition{Prop: properties.State, Friendly: "Status"},
279		StringColumnDefinition{Prop: properties.Vpc},
280		StringColumnDefinition{Prop: properties.Subnets},
281		StringColumnDefinition{Prop: properties.Description},
282	},
283	//Autoscaling
284	cloud.LaunchConfiguration: {
285		StringColumnDefinition{Prop: properties.Name},
286		StringColumnDefinition{Prop: properties.Type},
287		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
288		StringColumnDefinition{Prop: properties.KeyPair},
289	},
290	cloud.ScalingGroup: {
291		StringColumnDefinition{Prop: properties.Name},
292		StringColumnDefinition{Prop: properties.LaunchConfigurationName, Friendly: "LaunchConfiguration"},
293		StringColumnDefinition{Prop: properties.DesiredCapacity},
294		StringColumnDefinition{Prop: properties.State},
295		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
296		StringColumnDefinition{Prop: properties.NewInstancesProtected},
297	},
298	cloud.ScalingPolicy: {
299		StringColumnDefinition{Prop: properties.Name},
300		StringColumnDefinition{Prop: properties.Type},
301		StringColumnDefinition{Prop: properties.ScalingGroupName},
302		StringColumnDefinition{Prop: properties.AlarmNames},
303		StringColumnDefinition{Prop: properties.AdjustmentType},
304		StringColumnDefinition{Prop: properties.ScalingAdjustment},
305	},
306	//Containers
307	cloud.Repository: {
308		StringColumnDefinition{Prop: properties.Name},
309		StringColumnDefinition{Prop: properties.URI},
310		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
311		StringColumnDefinition{Prop: properties.Account},
312		StringColumnDefinition{Prop: properties.Arn},
313	},
314	cloud.ContainerCluster: {
315		StringColumnDefinition{Prop: properties.Name},
316		StringColumnDefinition{Prop: properties.State},
317		StringColumnDefinition{Prop: properties.ActiveServicesCount, Friendly: "ActiveServices"},
318		StringColumnDefinition{Prop: properties.PendingTasksCount, Friendly: "PendingTasks"},
319		StringColumnDefinition{Prop: properties.RegisteredContainerInstancesCount, Friendly: "RegisteredContainerInstances"},
320		StringColumnDefinition{Prop: properties.RunningTasksCount, Friendly: "RunningTasks"},
321	},
322	cloud.ContainerTask: {
323		StringColumnDefinition{Prop: properties.Name},
324		StringColumnDefinition{Prop: properties.Version},
325		StringColumnDefinition{Prop: properties.State},
326		KeyValuesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.ContainersImages}},
327		KeyValuesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Deployments}},
328	},
329	cloud.Container: {
330		StringColumnDefinition{Prop: properties.Name},
331		StringColumnDefinition{Prop: properties.DeploymentName},
332		StringColumnDefinition{Prop: properties.State},
333		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
334		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Launched}},
335		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Stopped}},
336		ARNLastValueColumnDefinition{Separator: "/", StringColumnDefinition: StringColumnDefinition{Prop: properties.Cluster}},
337		ARNLastValueColumnDefinition{Separator: "/", StringColumnDefinition: StringColumnDefinition{Prop: properties.ContainerTask}},
338	},
339	cloud.ContainerInstance: {
340		StringColumnDefinition{Prop: properties.ID},
341		StringColumnDefinition{Prop: properties.Instance},
342		ARNLastValueColumnDefinition{Separator: "/", StringColumnDefinition: StringColumnDefinition{Prop: properties.Cluster}},
343		StringColumnDefinition{Prop: properties.State},
344		StringColumnDefinition{Prop: properties.RunningTasksCount, Friendly: "RunningTasks"},
345		StringColumnDefinition{Prop: properties.PendingTasksCount, Friendly: "PendingTasks"},
346		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
347		StringColumnDefinition{Prop: properties.AgentConnected},
348	},
349	//ACM
350	cloud.Certificate: {
351		StringColumnDefinition{Prop: properties.Arn},
352		StringColumnDefinition{Prop: properties.Name},
353	},
354	//IAM
355	cloud.User: {
356		StringColumnDefinition{Prop: properties.ID},
357		StringColumnDefinition{Prop: properties.Name},
358		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.PasswordLastUsed, Friendly: "PasswordLastUsed"}},
359		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
360	},
361	cloud.Role: {
362		StringColumnDefinition{Prop: properties.ID},
363		StringColumnDefinition{Prop: properties.Name},
364		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
365	},
366	cloud.InstanceProfile: {
367		StringColumnDefinition{Prop: properties.ID},
368		StringColumnDefinition{Prop: properties.Name},
369		StringColumnDefinition{Prop: properties.Path},
370		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
371	},
372	cloud.Policy: {
373		StringColumnDefinition{Prop: properties.ID},
374		StringColumnDefinition{Prop: properties.Name},
375		StringColumnDefinition{Prop: properties.Type},
376		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
377		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Updated, Friendly: "Updated"}},
378		ColoredValueColumnDefinition{
379			StringColumnDefinition: StringColumnDefinition{Prop: properties.Attached},
380			ColoredValues:          map[string]color.Attribute{"false": color.FgYellow},
381		},
382	},
383	cloud.Group: {
384		StringColumnDefinition{Prop: properties.ID},
385		StringColumnDefinition{Prop: properties.Name},
386		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
387	},
388	cloud.AccessKey: {
389		StringColumnDefinition{Prop: properties.ID},
390		StringColumnDefinition{Prop: properties.State},
391		StringColumnDefinition{Prop: properties.Username},
392		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
393	},
394	cloud.MFADevice: {
395		StringColumnDefinition{Prop: properties.ID},
396		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.AttachedAt}},
397	},
398	// S3
399	cloud.Bucket: {
400		StringColumnDefinition{Prop: properties.ID},
401		GrantsColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Grants}},
402		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
403	},
404	cloud.S3Object: {
405		StringColumnDefinition{Prop: properties.ID, Friendly: "Name"},
406		StringColumnDefinition{Prop: properties.Bucket, Friendly: "Bucket"},
407		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Modified, Friendly: "Modified"}},
408		StringColumnDefinition{Prop: properties.Owner},
409		StorageColumnDefinition{Unit: b, StringColumnDefinition: StringColumnDefinition{Prop: properties.Size}},
410		StringColumnDefinition{Prop: properties.Class},
411	},
412	//Notification
413	cloud.Subscription: {
414		StringColumnDefinition{Prop: properties.Arn},
415		StringColumnDefinition{Prop: properties.Topic},
416		StringColumnDefinition{Prop: properties.Endpoint},
417		StringColumnDefinition{Prop: properties.Protocol},
418		StringColumnDefinition{Prop: properties.Owner},
419	},
420	cloud.Topic: {
421		StringColumnDefinition{Prop: properties.ID},
422	},
423	//Queue
424	cloud.Queue: {
425		StringColumnDefinition{Prop: properties.ID, Friendly: "URL"},
426		StringColumnDefinition{Prop: properties.ApproximateMessageCount, Friendly: "~NbMsg"},
427		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
428		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Modified, Friendly: "LastModif"}},
429		StringColumnDefinition{Prop: properties.Delay, Friendly: "Delay(s)"},
430	},
431	// DNS
432	cloud.Zone: {
433		StringColumnDefinition{Prop: properties.ID},
434		StringColumnDefinition{Prop: properties.Name},
435		StringColumnDefinition{Prop: properties.Comment},
436		StringColumnDefinition{Prop: properties.Private, Friendly: "Private"},
437		StringColumnDefinition{Prop: properties.RecordCount, Friendly: "Nb Records"},
438		StringColumnDefinition{Prop: properties.CallerReference},
439	},
440	cloud.Record: {
441		StringColumnDefinition{Prop: properties.ID, Friendly: "AwlessId"},
442		StringColumnDefinition{Prop: properties.Type},
443		StringColumnDefinition{Prop: properties.Name},
444		SliceColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Records}},
445		StringColumnDefinition{Prop: properties.Zone},
446		StringColumnDefinition{Prop: properties.Alias},
447		StringColumnDefinition{Prop: properties.TTL},
448	},
449	// Lamba
450	cloud.Function: {
451		StringColumnDefinition{Prop: properties.Name},
452		StorageColumnDefinition{Unit: b, StringColumnDefinition: StringColumnDefinition{Prop: properties.Size}},
453		StorageColumnDefinition{Unit: mb, StringColumnDefinition: StringColumnDefinition{Prop: properties.Memory}},
454		StringColumnDefinition{Prop: properties.Runtime},
455		StringColumnDefinition{Prop: properties.Version},
456		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Modified}},
457		StringColumnDefinition{Prop: properties.Description},
458	},
459	//Monitoring
460	cloud.Metric: {
461		StringColumnDefinition{Prop: properties.ID},
462		StringColumnDefinition{Prop: properties.Name},
463		StringColumnDefinition{Prop: properties.Namespace},
464		KeyValuesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Dimensions}},
465	},
466	cloud.Alarm: {
467		StringColumnDefinition{Prop: properties.Name},
468		StringColumnDefinition{Prop: properties.Namespace},
469		StringColumnDefinition{Prop: properties.MetricName},
470		StringColumnDefinition{Prop: properties.Description},
471		StringColumnDefinition{Prop: properties.State},
472		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Updated}},
473		KeyValuesColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Dimensions}},
474	},
475	//CDN
476	cloud.Distribution: {
477		StringColumnDefinition{Prop: properties.ID},
478		StringColumnDefinition{Prop: properties.PublicDNS},
479		StringColumnDefinition{Prop: properties.Enabled},
480		StringColumnDefinition{Prop: properties.State},
481		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Modified}},
482		SliceColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Aliases}},
483		StringColumnDefinition{Prop: properties.SSLSupportMethod},
484		SliceColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Origins}},
485	},
486	//Cloudformation
487	cloud.Stack: {
488		StringColumnDefinition{Prop: properties.ID},
489		StringColumnDefinition{Prop: properties.Name},
490		StringColumnDefinition{Prop: properties.State},
491		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Created}},
492		TimeColumnDefinition{StringColumnDefinition: StringColumnDefinition{Prop: properties.Modified}},
493	},
494}
495