1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
|
package entities
import (
"errors"
"strings"
"time"
commonFlag "github.com/containers/common/pkg/flag"
"github.com/containers/podman/v4/libpod/define"
"github.com/containers/podman/v4/pkg/specgen"
"github.com/containers/podman/v4/pkg/util"
"github.com/opencontainers/runtime-spec/specs-go"
)
type PodKillOptions struct {
All bool
Latest bool
Signal string
}
type PodKillReport struct {
Errs []error
Id string //nolint:revive,stylecheck
}
type ListPodsReport struct {
Cgroup string
Containers []*ListPodContainer
Created time.Time
Id string //nolint:revive,stylecheck
InfraId string //nolint:revive,stylecheck
Name string
Namespace string
// Network names connected to infra container
Networks []string
Status string
Labels map[string]string
}
type ListPodContainer struct {
Id string //nolint:revive,stylecheck
Names string
Status string
}
type PodPauseOptions struct {
All bool
Latest bool
}
type PodPauseReport struct {
Errs []error
Id string //nolint:revive,stylecheck
}
type PodunpauseOptions struct {
All bool
Latest bool
}
type PodUnpauseReport struct {
Errs []error
Id string //nolint:revive,stylecheck
}
type PodStopOptions struct {
All bool
Ignore bool
Latest bool
Timeout int
}
type PodStopReport struct {
Errs []error
Id string //nolint:revive,stylecheck
}
type PodRestartOptions struct {
All bool
Latest bool
}
type PodRestartReport struct {
Errs []error
Id string //nolint:revive,stylecheck
}
type PodStartOptions struct {
All bool
Latest bool
}
type PodStartReport struct {
Errs []error
Id string //nolint:revive,stylecheck
}
type PodRmOptions struct {
All bool
Force bool
Ignore bool
Latest bool
Timeout *uint
}
type PodRmReport struct {
Err error
Id string //nolint:revive,stylecheck
}
// PddSpec is an abstracted version of PodSpecGen designed to eventually accept options
// not meant to be in a specgen
type PodSpec struct {
PodSpecGen specgen.PodSpecGenerator
}
// PodCreateOptions provides all possible options for creating a pod and its infra container.
// The JSON tags below are made to match the respective field in ContainerCreateOptions for the purpose of mapping.
// swagger:model PodCreateOptions
type PodCreateOptions struct {
CgroupParent string `json:"cgroup_parent,omitempty"`
CreateCommand []string `json:"create_command,omitempty"`
Devices []string `json:"devices,omitempty"`
DeviceReadBPs []string `json:"device_read_bps,omitempty"`
ExitPolicy string `json:"exit_policy,omitempty"`
Hostname string `json:"hostname,omitempty"`
Infra bool `json:"infra,omitempty"`
InfraImage string `json:"infra_image,omitempty"`
InfraName string `json:"container_name,omitempty"`
InfraCommand *string `json:"container_command,omitempty"`
InfraConmonPidFile string `json:"container_conmon_pidfile,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
Name string `json:"name,omitempty"`
Net *NetOptions `json:"net,omitempty"`
Share []string `json:"share,omitempty"`
ShareParent *bool `json:"share_parent,omitempty"`
Pid string `json:"pid,omitempty"`
Cpus float64 `json:"cpus,omitempty"`
CpusetCpus string `json:"cpuset_cpus,omitempty"`
Userns specgen.Namespace `json:"-"`
Volume []string `json:"volume,omitempty"`
VolumesFrom []string `json:"volumes_from,omitempty"`
SecurityOpt []string `json:"security_opt,omitempty"`
Sysctl []string `json:"sysctl,omitempty"`
}
// PodLogsOptions describes the options to extract pod logs.
type PodLogsOptions struct {
// Other fields are exactly same as ContainerLogOpts
ContainerLogsOptions
// If specified will only fetch the logs of specified container
ContainerName string
// Show different colors in the logs.
Color bool
}
type ContainerCreateOptions struct {
Annotation []string
Attach []string
Authfile string
BlkIOWeight string
BlkIOWeightDevice []string
CapAdd []string
CapDrop []string
CgroupNS string
CgroupsMode string
CgroupParent string `json:"cgroup_parent,omitempty"`
CIDFile string
ConmonPIDFile string `json:"container_conmon_pidfile,omitempty"`
CPUPeriod uint64
CPUQuota int64
CPURTPeriod uint64
CPURTRuntime int64
CPUShares uint64
CPUS float64 `json:"cpus,omitempty"`
CPUSetCPUs string `json:"cpuset_cpus,omitempty"`
CPUSetMems string
Devices []string `json:"devices,omitempty"`
DeviceCgroupRule []string
DeviceReadBPs []string `json:"device_read_bps,omitempty"`
DeviceReadIOPs []string
DeviceWriteBPs []string
DeviceWriteIOPs []string
Entrypoint *string `json:"container_command,omitempty"`
Env []string
EnvHost bool
EnvFile []string
Expose []string
GIDMap []string
GroupAdd []string
HealthCmd string
HealthInterval string
HealthRetries uint
HealthStartPeriod string
HealthTimeout string
Hostname string `json:"hostname,omitempty"`
HTTPProxy bool
HostUsers []string
ImageVolume string
Init bool
InitContainerType string
InitPath string
Interactive bool
IPC string
Label []string
LabelFile []string
LogDriver string
LogOptions []string
Memory string
MemoryReservation string
MemorySwap string
MemorySwappiness int64
Name string `json:"container_name"`
NoHealthCheck bool
OOMKillDisable bool
OOMScoreAdj *int
Arch string
OS string
Variant string
PID string `json:"pid,omitempty"`
PIDsLimit *int64
Platform string
Pod string
PodIDFile string
Personality string
PreserveFDs uint
Privileged bool
PublishAll bool
Pull string
Quiet bool
ReadOnly bool
ReadOnlyTmpFS bool
Restart string
Replace bool
Requires []string
Rm bool
RootFS bool
Secrets []string
SecurityOpt []string `json:"security_opt,omitempty"`
SdNotifyMode string
ShmSize string
SignaturePolicy string
StopSignal string
StopTimeout uint
StorageOpts []string
SubUIDName string
SubGIDName string
Sysctl []string `json:"sysctl,omitempty"`
Systemd string
Timeout uint
TLSVerify commonFlag.OptionalBool
TmpFS []string
TTY bool
Timezone string
Umask string
UnsetEnv []string
UnsetEnvAll bool
UIDMap []string
Ulimit []string
User string
UserNS string `json:"-"`
UTS string
Mount []string
Volume []string `json:"volume,omitempty"`
VolumesFrom []string `json:"volumes_from,omitempty"`
Workdir string
SeccompPolicy string
PidFile string
ChrootDirs []string
IsInfra bool
IsClone bool
Net *NetOptions `json:"net,omitempty"`
CgroupConf []string
PasswdEntry string
}
func NewInfraContainerCreateOptions() ContainerCreateOptions {
options := ContainerCreateOptions{
IsInfra: true,
ImageVolume: "bind",
MemorySwappiness: -1,
}
return options
}
type PodCreateReport struct {
Id string //nolint:revive,stylecheck
}
func (p *PodCreateOptions) CPULimits() *specs.LinuxCPU {
cpu := &specs.LinuxCPU{}
hasLimits := false
if p.Cpus != 0 {
period, quota := util.CoresToPeriodAndQuota(p.Cpus)
cpu.Period = &period
cpu.Quota = "a
hasLimits = true
}
if p.CpusetCpus != "" {
cpu.Cpus = p.CpusetCpus
hasLimits = true
}
if !hasLimits {
return cpu
}
return cpu
}
func ToPodSpecGen(s specgen.PodSpecGenerator, p *PodCreateOptions) (*specgen.PodSpecGenerator, error) {
// Basic Config
s.Name = p.Name
s.InfraName = p.InfraName
out, err := specgen.ParseNamespace(p.Pid)
if err != nil {
return nil, err
}
s.Pid = out
s.Hostname = p.Hostname
s.ExitPolicy = p.ExitPolicy
s.Labels = p.Labels
s.Devices = p.Devices
s.SecurityOpt = p.SecurityOpt
s.NoInfra = !p.Infra
if p.InfraCommand != nil && len(*p.InfraCommand) > 0 {
s.InfraCommand = strings.Split(*p.InfraCommand, " ")
}
if len(p.InfraConmonPidFile) > 0 {
s.InfraConmonPidFile = p.InfraConmonPidFile
}
s.InfraImage = p.InfraImage
s.SharedNamespaces = p.Share
s.ShareParent = p.ShareParent
s.PodCreateCommand = p.CreateCommand
s.VolumesFrom = p.VolumesFrom
// Networking config
if p.Net != nil {
s.NetNS = p.Net.Network
s.PortMappings = p.Net.PublishPorts
s.Networks = p.Net.Networks
s.NetworkOptions = p.Net.NetworkOptions
if p.Net.UseImageResolvConf {
s.NoManageResolvConf = true
}
s.DNSServer = p.Net.DNSServers
s.DNSSearch = p.Net.DNSSearch
s.DNSOption = p.Net.DNSOptions
s.NoManageHosts = p.Net.NoHosts
s.HostAdd = p.Net.AddHosts
}
// Cgroup
s.CgroupParent = p.CgroupParent
// Resource config
cpuDat := p.CPULimits()
if s.ResourceLimits == nil {
s.ResourceLimits = &specs.LinuxResources{}
s.ResourceLimits.CPU = &specs.LinuxCPU{}
}
if cpuDat != nil {
s.ResourceLimits.CPU = cpuDat
if p.Cpus != 0 {
s.CPUPeriod = *cpuDat.Period
s.CPUQuota = *cpuDat.Quota
}
}
s.Userns = p.Userns
sysctl := map[string]string{}
if ctl := p.Sysctl; len(ctl) > 0 {
sysctl, err = util.ValidateSysctls(ctl)
if err != nil {
return nil, err
}
}
s.Sysctl = sysctl
return &s, nil
}
type PodPruneOptions struct {
Force bool `json:"force" schema:"force"`
}
type PodPruneReport struct {
Err error
Id string //nolint:revive,stylecheck
}
type PodTopOptions struct {
// CLI flags.
ListDescriptors bool
Latest bool
// Options for the API.
Descriptors []string
NameOrID string
}
type PodPSOptions struct {
CtrNames bool
CtrIds bool
CtrStatus bool
Filters map[string][]string
Format string
Latest bool
Namespace bool
Quiet bool
Sort string
}
type PodInspectOptions struct {
Latest bool
// Options for the API.
NameOrID string
Format string
}
type PodInspectReport struct {
*define.InspectPodData
}
// PodStatsOptions are options for the pod stats command.
type PodStatsOptions struct {
// All - provide stats for all running pods.
All bool
// Latest - provide stats for the latest pod.
Latest bool
}
// PodStatsReport includes pod-resource statistics data.
type PodStatsReport struct {
// Percentage of CPU utilized by pod
// example: 75.5%
CPU string
// Humanized Memory usage and maximum
// example: 12mb / 24mb
MemUsage string
// Memory usage and maximum in bytes
// example: 1,000,000 / 4,000,000
MemUsageBytes string
// Percentage of Memory utilized by pod
// example: 50.5%
Mem string
// Network usage inbound + outbound
NetIO string
// Humanized disk usage read + write
BlockIO string
// Container PID
PIDS string
// Pod ID
// example: 62310217a19e
Pod string
// Container ID
// example: e43534f89a7d
CID string
// Pod Name
// example: elastic_pascal
Name string
}
// ValidatePodStatsOptions validates the specified slice and options. Allows
// for sharing code in the front- and the back-end.
func ValidatePodStatsOptions(args []string, options *PodStatsOptions) error {
num := 0
if len(args) > 0 {
num++
}
if options.All {
num++
}
if options.Latest {
num++
}
switch num {
case 0:
// Podman v1 compat: if nothing's specified get all running
// pods.
options.All = true
return nil
case 1:
return nil
default:
return errors.New("--all, --latest and arguments cannot be used together")
}
}
// PodLogsOptionsToContainerLogsOptions converts PodLogOptions to ContainerLogOptions
func PodLogsOptionsToContainerLogsOptions(options PodLogsOptions) ContainerLogsOptions {
// PodLogsOptions are similar but contains few extra fields like ctrName
// So cast other values as is so we can re-use the code
containerLogsOpts := ContainerLogsOptions{
Details: options.Details,
Latest: options.Latest,
Follow: options.Follow,
Names: options.Names,
Since: options.Since,
Until: options.Until,
Tail: options.Tail,
Timestamps: options.Timestamps,
Colors: options.Colors,
StdoutWriter: options.StdoutWriter,
StderrWriter: options.StderrWriter,
}
return containerLogsOpts
}
|