github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/varlinkapi/intermediate_varlink.go (about) 1 // +build varlink remoteclient 2 3 package varlinkapi 4 5 import ( 6 "github.com/containers/common/pkg/config" 7 "github.com/containers/podman/v2/pkg/rootless" 8 iopodman "github.com/containers/podman/v2/pkg/varlink" 9 "github.com/pkg/errors" 10 ) 11 12 //FIXME these are duplicated here to resolve a circular 13 //import with cmd/podman/common. 14 var ( 15 // DefaultHealthCheckInterval default value 16 DefaultHealthCheckInterval = "30s" 17 // DefaultHealthCheckRetries default value 18 DefaultHealthCheckRetries uint = 3 19 // DefaultHealthCheckStartPeriod default value 20 DefaultHealthCheckStartPeriod = "0s" 21 // DefaultHealthCheckTimeout default value 22 DefaultHealthCheckTimeout = "30s" 23 // DefaultImageVolume default value 24 DefaultImageVolume = "bind" 25 ) 26 27 // StringSliceToPtr converts a genericcliresult value into a *[]string 28 func StringSliceToPtr(g GenericCLIResult) *[]string { 29 if !g.IsSet() { 30 return nil 31 } 32 newT := g.Value().([]string) 33 return &newT 34 } 35 36 // StringToPtr converts a genericcliresult value into a *string 37 func StringToPtr(g GenericCLIResult) *string { 38 if !g.IsSet() { 39 return nil 40 } 41 newT := g.Value().(string) 42 return &newT 43 } 44 45 // BoolToPtr converts a genericcliresult value into a *bool 46 func BoolToPtr(g GenericCLIResult) *bool { 47 if !g.IsSet() { 48 return nil 49 } 50 newT := g.Value().(bool) 51 return &newT 52 } 53 54 // AnyIntToInt64Ptr converts a genericcliresult value into an *int64 55 func AnyIntToInt64Ptr(g GenericCLIResult) *int64 { 56 if !g.IsSet() { 57 return nil 58 } 59 var newT int64 60 switch g.Value().(type) { 61 case int: 62 newT = int64(g.Value().(int)) 63 case int64: 64 newT = g.Value().(int64) 65 case uint64: 66 newT = int64(g.Value().(uint64)) 67 case uint: 68 newT = int64(g.Value().(uint)) 69 default: 70 panic(errors.Errorf("invalid int type")) 71 } 72 return &newT 73 } 74 75 // Float64ToPtr converts a genericcliresult into a *float64 76 func Float64ToPtr(g GenericCLIResult) *float64 { 77 if !g.IsSet() { 78 return nil 79 } 80 newT := g.Value().(float64) 81 return &newT 82 } 83 84 // MakeVarlink creates a varlink transportable struct from GenericCLIResults 85 func (g GenericCLIResults) MakeVarlink() iopodman.Create { 86 v := iopodman.Create{ 87 Args: g.InputArgs, 88 AddHost: StringSliceToPtr(g.Find("add-host")), 89 Annotation: StringSliceToPtr(g.Find("annotation")), 90 Attach: StringSliceToPtr(g.Find("attach")), 91 BlkioWeight: StringToPtr(g.Find("blkio-weight")), 92 BlkioWeightDevice: StringSliceToPtr(g.Find("blkio-weight-device")), 93 CapAdd: StringSliceToPtr(g.Find("cap-add")), 94 CapDrop: StringSliceToPtr(g.Find("cap-drop")), 95 CgroupParent: StringToPtr(g.Find("cgroup-parent")), 96 CidFile: StringToPtr(g.Find("cidfile")), 97 ConmonPidfile: StringToPtr(g.Find("conmon-pidfile")), 98 CpuPeriod: AnyIntToInt64Ptr(g.Find("cpu-period")), 99 CpuQuota: AnyIntToInt64Ptr(g.Find("cpu-quota")), 100 CpuRtPeriod: AnyIntToInt64Ptr(g.Find("cpu-rt-period")), 101 CpuRtRuntime: AnyIntToInt64Ptr(g.Find("cpu-rt-runtime")), 102 CpuShares: AnyIntToInt64Ptr(g.Find("cpu-shares")), 103 Cpus: Float64ToPtr(g.Find("cpus")), 104 CpuSetCpus: StringToPtr(g.Find("cpuset-cpus")), 105 CpuSetMems: StringToPtr(g.Find("cpuset-mems")), 106 Detach: BoolToPtr(g.Find("detach")), 107 DetachKeys: StringToPtr(g.Find("detach-keys")), 108 Device: StringSliceToPtr(g.Find("device")), 109 DeviceReadBps: StringSliceToPtr(g.Find("device-read-bps")), 110 DeviceReadIops: StringSliceToPtr(g.Find("device-read-iops")), 111 DeviceWriteBps: StringSliceToPtr(g.Find("device-write-bps")), 112 DeviceWriteIops: StringSliceToPtr(g.Find("device-write-iops")), 113 Dns: StringSliceToPtr(g.Find("dns")), 114 DnsOpt: StringSliceToPtr(g.Find("dns-opt")), 115 DnsSearch: StringSliceToPtr(g.Find("dns-search")), 116 Entrypoint: StringToPtr(g.Find("entrypoint")), 117 Env: StringSliceToPtr(g.Find("env")), 118 EnvFile: StringSliceToPtr(g.Find("env-file")), 119 Expose: StringSliceToPtr(g.Find("expose")), 120 Gidmap: StringSliceToPtr(g.Find("gidmap")), 121 Groupadd: StringSliceToPtr(g.Find("group-add")), 122 HealthcheckCommand: StringToPtr(g.Find("healthcheck-command")), 123 HealthcheckInterval: StringToPtr(g.Find("healthcheck-interval")), 124 HealthcheckRetries: AnyIntToInt64Ptr(g.Find("healthcheck-retries")), 125 HealthcheckStartPeriod: StringToPtr(g.Find("healthcheck-start-period")), 126 HealthcheckTimeout: StringToPtr(g.Find("healthcheck-timeout")), 127 Hostname: StringToPtr(g.Find("hostname")), 128 ImageVolume: StringToPtr(g.Find("image-volume")), 129 Init: BoolToPtr(g.Find("init")), 130 InitPath: StringToPtr(g.Find("init-path")), 131 Interactive: BoolToPtr(g.Find("interactive")), 132 Ip: StringToPtr(g.Find("ip")), 133 Ipc: StringToPtr(g.Find("ipc")), 134 KernelMemory: StringToPtr(g.Find("kernel-memory")), 135 Label: StringSliceToPtr(g.Find("label")), 136 LabelFile: StringSliceToPtr(g.Find("label-file")), 137 LogDriver: StringToPtr(g.Find("log-driver")), 138 LogOpt: StringSliceToPtr(g.Find("log-opt")), 139 MacAddress: StringToPtr(g.Find("mac-address")), 140 Memory: StringToPtr(g.Find("memory")), 141 MemoryReservation: StringToPtr(g.Find("memory-reservation")), 142 MemorySwap: StringToPtr(g.Find("memory-swap")), 143 MemorySwappiness: AnyIntToInt64Ptr(g.Find("memory-swappiness")), 144 Name: StringToPtr(g.Find("name")), 145 Network: StringToPtr(g.Find("network")), 146 OomKillDisable: BoolToPtr(g.Find("oom-kill-disable")), 147 OomScoreAdj: AnyIntToInt64Ptr(g.Find("oom-score-adj")), 148 OverrideOS: StringToPtr(g.Find("override-os")), 149 OverrideArch: StringToPtr(g.Find("override-arch")), 150 Pid: StringToPtr(g.Find("pid")), 151 PidsLimit: AnyIntToInt64Ptr(g.Find("pids-limit")), 152 Pod: StringToPtr(g.Find("pod")), 153 Privileged: BoolToPtr(g.Find("privileged")), 154 Publish: StringSliceToPtr(g.Find("publish")), 155 PublishAll: BoolToPtr(g.Find("publish-all")), 156 Pull: StringToPtr(g.Find("pull")), 157 Quiet: BoolToPtr(g.Find("quiet")), 158 Readonly: BoolToPtr(g.Find("read-only")), 159 Readonlytmpfs: BoolToPtr(g.Find("read-only-tmpfs")), 160 Restart: StringToPtr(g.Find("restart")), 161 Rm: BoolToPtr(g.Find("rm")), 162 Rootfs: BoolToPtr(g.Find("rootfs")), 163 SecurityOpt: StringSliceToPtr(g.Find("security-opt")), 164 ShmSize: StringToPtr(g.Find("shm-size")), 165 StopSignal: StringToPtr(g.Find("stop-signal")), 166 StopTimeout: AnyIntToInt64Ptr(g.Find("stop-timeout")), 167 StorageOpt: StringSliceToPtr(g.Find("storage-opt")), 168 Subuidname: StringToPtr(g.Find("subuidname")), 169 Subgidname: StringToPtr(g.Find("subgidname")), 170 Sysctl: StringSliceToPtr(g.Find("sysctl")), 171 Systemd: StringToPtr(g.Find("systemd")), 172 Tmpfs: StringSliceToPtr(g.Find("tmpfs")), 173 Tty: BoolToPtr(g.Find("tty")), 174 Uidmap: StringSliceToPtr(g.Find("uidmap")), 175 Ulimit: StringSliceToPtr(g.Find("ulimit")), 176 User: StringToPtr(g.Find("user")), 177 Userns: StringToPtr(g.Find("userns")), 178 Uts: StringToPtr(g.Find("uts")), 179 Mount: StringSliceToPtr(g.Find("mount")), 180 Volume: StringSliceToPtr(g.Find("volume")), 181 VolumesFrom: StringSliceToPtr(g.Find("volumes-from")), 182 WorkDir: StringToPtr(g.Find("workdir")), 183 } 184 185 return v 186 } 187 188 func stringSliceFromVarlink(v *[]string, flagName string, defaultValue *[]string) CRStringSlice { 189 cr := CRStringSlice{} 190 if v == nil { 191 cr.Val = []string{} 192 if defaultValue != nil { 193 cr.Val = *defaultValue 194 } 195 cr.Changed = false 196 } else { 197 cr.Val = *v 198 cr.Changed = true 199 } 200 cr.Flag = flagName 201 return cr 202 } 203 204 func stringFromVarlink(v *string, flagName string, defaultValue *string) CRString { 205 cr := CRString{} 206 if v == nil { 207 cr.Val = "" 208 if defaultValue != nil { 209 cr.Val = *defaultValue 210 } 211 cr.Changed = false 212 } else { 213 cr.Val = *v 214 cr.Changed = true 215 } 216 cr.Flag = flagName 217 return cr 218 } 219 220 func boolFromVarlink(v *bool, flagName string, defaultValue bool) CRBool { 221 cr := CRBool{} 222 if v == nil { 223 // In case a cli bool default value is true 224 cr.Val = defaultValue 225 cr.Changed = false 226 } else { 227 cr.Val = *v 228 cr.Changed = true 229 } 230 cr.Flag = flagName 231 return cr 232 } 233 234 func uint64FromVarlink(v *int64, flagName string, defaultValue *uint64) CRUint64 { 235 cr := CRUint64{} 236 if v == nil { 237 cr.Val = 0 238 if defaultValue != nil { 239 cr.Val = *defaultValue 240 } 241 cr.Changed = false 242 } else { 243 cr.Val = uint64(*v) 244 cr.Changed = true 245 } 246 cr.Flag = flagName 247 return cr 248 } 249 250 func int64FromVarlink(v *int64, flagName string, defaultValue *int64) CRInt64 { 251 cr := CRInt64{} 252 if v == nil { 253 cr.Val = 0 254 if defaultValue != nil { 255 cr.Val = *defaultValue 256 } 257 cr.Changed = false 258 } else { 259 cr.Val = *v 260 cr.Changed = true 261 } 262 cr.Flag = flagName 263 return cr 264 } 265 266 func float64FromVarlink(v *float64, flagName string, defaultValue *float64) CRFloat64 { 267 cr := CRFloat64{} 268 if v == nil { 269 cr.Val = 0 270 if defaultValue != nil { 271 cr.Val = *defaultValue 272 } 273 cr.Changed = false 274 } else { 275 cr.Val = *v 276 cr.Changed = true 277 } 278 cr.Flag = flagName 279 return cr 280 } 281 282 func uintFromVarlink(v *int64, flagName string, defaultValue *uint) CRUint { 283 cr := CRUint{} 284 if v == nil { 285 cr.Val = 0 286 if defaultValue != nil { 287 cr.Val = *defaultValue 288 } 289 cr.Changed = false 290 } else { 291 cr.Val = uint(*v) 292 cr.Changed = true 293 } 294 cr.Flag = flagName 295 return cr 296 } 297 298 func stringArrayFromVarlink(v *[]string, flagName string, defaultValue *[]string) CRStringArray { 299 cr := CRStringArray{} 300 if v == nil { 301 cr.Val = []string{} 302 if defaultValue != nil { 303 cr.Val = *defaultValue 304 } 305 cr.Changed = false 306 } else { 307 cr.Val = *v 308 cr.Changed = true 309 } 310 cr.Flag = flagName 311 return cr 312 } 313 314 func intFromVarlink(v *int64, flagName string, defaultValue *int) CRInt { 315 cr := CRInt{} 316 if v == nil { 317 if defaultValue != nil { 318 cr.Val = *defaultValue 319 } 320 cr.Val = 0 321 cr.Changed = false 322 } else { 323 cr.Val = int(*v) 324 cr.Changed = true 325 } 326 cr.Flag = flagName 327 return cr 328 } 329 330 // VarlinkCreateToGeneric creates a GenericCLIResults from the varlink create 331 // structure. 332 func VarlinkCreateToGeneric(opts iopodman.Create) GenericCLIResults { 333 // FIXME this will need to be fixed!!!!! With containers conf 334 //containerConfig := cliconfig.GetDefaultConfig() 335 // TODO | WARN 336 // We do not get a default network over varlink. Unlike the other default values for some cli 337 // elements, it seems it gets set to the default anyway. 338 339 var memSwapDefault int64 = -1 340 netModeDefault := "bridge" 341 systemdDefault := "true" 342 if rootless.IsRootless() { 343 netModeDefault = "slirp4netns" 344 } 345 346 shmSize := config.DefaultShmSize 347 348 m := make(map[string]GenericCLIResult) 349 m["add-host"] = stringSliceFromVarlink(opts.AddHost, "add-host", nil) 350 m["annotation"] = stringSliceFromVarlink(opts.Annotation, "annotation", nil) 351 m["attach"] = stringSliceFromVarlink(opts.Attach, "attach", nil) 352 m["blkio-weight"] = stringFromVarlink(opts.BlkioWeight, "blkio-weight", nil) 353 m["blkio-weight-device"] = stringSliceFromVarlink(opts.BlkioWeightDevice, "blkio-weight-device", nil) 354 m["cap-add"] = stringSliceFromVarlink(opts.CapAdd, "cap-add", nil) 355 m["cap-drop"] = stringSliceFromVarlink(opts.CapDrop, "cap-drop", nil) 356 m["cgroup-parent"] = stringFromVarlink(opts.CgroupParent, "cgroup-parent", nil) 357 m["cidfile"] = stringFromVarlink(opts.CidFile, "cidfile", nil) 358 m["conmon-pidfile"] = stringFromVarlink(opts.ConmonPidfile, "conmon-file", nil) 359 m["cpu-period"] = uint64FromVarlink(opts.CpuPeriod, "cpu-period", nil) 360 m["cpu-quota"] = int64FromVarlink(opts.CpuQuota, "quota", nil) 361 m["cpu-rt-period"] = uint64FromVarlink(opts.CpuRtPeriod, "cpu-rt-period", nil) 362 m["cpu-rt-runtime"] = int64FromVarlink(opts.CpuRtRuntime, "cpu-rt-quota", nil) 363 m["cpu-shares"] = uint64FromVarlink(opts.CpuShares, "cpu-shares", nil) 364 m["cpus"] = float64FromVarlink(opts.Cpus, "cpus", nil) 365 m["cpuset-cpus"] = stringFromVarlink(opts.CpuSetCpus, "cpuset-cpus", nil) 366 m["cpuset-mems"] = stringFromVarlink(opts.CpuSetMems, "cpuset-mems", nil) 367 m["detach"] = boolFromVarlink(opts.Detach, "detach", false) 368 m["detach-keys"] = stringFromVarlink(opts.DetachKeys, "detach-keys", nil) 369 m["device"] = stringSliceFromVarlink(opts.Device, "device", nil) 370 m["device-read-bps"] = stringSliceFromVarlink(opts.DeviceReadBps, "device-read-bps", nil) 371 m["device-read-iops"] = stringSliceFromVarlink(opts.DeviceReadIops, "device-read-iops", nil) 372 m["device-write-bps"] = stringSliceFromVarlink(opts.DeviceWriteBps, "write-device-bps", nil) 373 m["device-write-iops"] = stringSliceFromVarlink(opts.DeviceWriteIops, "write-device-iops", nil) 374 m["dns"] = stringSliceFromVarlink(opts.Dns, "dns", nil) 375 m["dns-opt"] = stringSliceFromVarlink(opts.DnsOpt, "dns-opt", nil) 376 m["dns-search"] = stringSliceFromVarlink(opts.DnsSearch, "dns-search", nil) 377 m["entrypoint"] = stringFromVarlink(opts.Entrypoint, "entrypoint", nil) 378 m["env"] = stringArrayFromVarlink(opts.Env, "env", nil) 379 m["env-file"] = stringSliceFromVarlink(opts.EnvFile, "env-file", nil) 380 m["expose"] = stringSliceFromVarlink(opts.Expose, "expose", nil) 381 m["gidmap"] = stringSliceFromVarlink(opts.Gidmap, "gidmap", nil) 382 m["group-add"] = stringSliceFromVarlink(opts.Groupadd, "group-add", nil) 383 m["healthcheck-command"] = stringFromVarlink(opts.HealthcheckCommand, "healthcheck-command", nil) 384 m["healthcheck-interval"] = stringFromVarlink(opts.HealthcheckInterval, "healthcheck-interval", &DefaultHealthCheckInterval) 385 m["healthcheck-retries"] = uintFromVarlink(opts.HealthcheckRetries, "healthcheck-retries", &DefaultHealthCheckRetries) 386 m["healthcheck-start-period"] = stringFromVarlink(opts.HealthcheckStartPeriod, "healthcheck-start-period", &DefaultHealthCheckStartPeriod) 387 m["healthcheck-timeout"] = stringFromVarlink(opts.HealthcheckTimeout, "healthcheck-timeout", &DefaultHealthCheckTimeout) 388 m["hostname"] = stringFromVarlink(opts.Hostname, "hostname", nil) 389 m["image-volume"] = stringFromVarlink(opts.ImageVolume, "image-volume", &DefaultImageVolume) 390 m["init"] = boolFromVarlink(opts.Init, "init", false) 391 m["init-path"] = stringFromVarlink(opts.InitPath, "init-path", nil) 392 m["interactive"] = boolFromVarlink(opts.Interactive, "interactive", false) 393 m["ip"] = stringFromVarlink(opts.Ip, "ip", nil) 394 m["ipc"] = stringFromVarlink(opts.Ipc, "ipc", nil) 395 m["kernel-memory"] = stringFromVarlink(opts.KernelMemory, "kernel-memory", nil) 396 m["label"] = stringArrayFromVarlink(opts.Label, "label", nil) 397 m["label-file"] = stringSliceFromVarlink(opts.LabelFile, "label-file", nil) 398 m["log-driver"] = stringFromVarlink(opts.LogDriver, "log-driver", nil) 399 m["log-opt"] = stringSliceFromVarlink(opts.LogOpt, "log-opt", nil) 400 m["mac-address"] = stringFromVarlink(opts.MacAddress, "mac-address", nil) 401 m["memory"] = stringFromVarlink(opts.Memory, "memory", nil) 402 m["memory-reservation"] = stringFromVarlink(opts.MemoryReservation, "memory-reservation", nil) 403 m["memory-swap"] = stringFromVarlink(opts.MemorySwap, "memory-swap", nil) 404 m["memory-swappiness"] = int64FromVarlink(opts.MemorySwappiness, "memory-swappiness", &memSwapDefault) 405 m["name"] = stringFromVarlink(opts.Name, "name", nil) 406 m["network"] = stringFromVarlink(opts.Network, "network", &netModeDefault) 407 m["no-hosts"] = boolFromVarlink(opts.NoHosts, "no-hosts", false) 408 m["oom-kill-disable"] = boolFromVarlink(opts.OomKillDisable, "oon-kill-disable", false) 409 m["oom-score-adj"] = intFromVarlink(opts.OomScoreAdj, "oom-score-adj", nil) 410 m["override-os"] = stringFromVarlink(opts.OverrideOS, "override-os", nil) 411 m["override-arch"] = stringFromVarlink(opts.OverrideArch, "override-arch", nil) 412 m["pid"] = stringFromVarlink(opts.Pid, "pid", nil) 413 m["pids-limit"] = int64FromVarlink(opts.PidsLimit, "pids-limit", nil) 414 m["pod"] = stringFromVarlink(opts.Pod, "pod", nil) 415 m["privileged"] = boolFromVarlink(opts.Privileged, "privileged", false) 416 m["publish"] = stringSliceFromVarlink(opts.Publish, "publish", nil) 417 m["publish-all"] = boolFromVarlink(opts.PublishAll, "publish-all", false) 418 m["pull"] = stringFromVarlink(opts.Pull, "missing", nil) 419 m["quiet"] = boolFromVarlink(opts.Quiet, "quiet", false) 420 m["read-only"] = boolFromVarlink(opts.Readonly, "read-only", false) 421 m["read-only-tmpfs"] = boolFromVarlink(opts.Readonlytmpfs, "read-only-tmpfs", true) 422 m["restart"] = stringFromVarlink(opts.Restart, "restart", nil) 423 m["rm"] = boolFromVarlink(opts.Rm, "rm", false) 424 m["rootfs"] = boolFromVarlink(opts.Rootfs, "rootfs", false) 425 m["security-opt"] = stringArrayFromVarlink(opts.SecurityOpt, "security-opt", nil) 426 m["shm-size"] = stringFromVarlink(opts.ShmSize, "shm-size", &shmSize) 427 m["stop-signal"] = stringFromVarlink(opts.StopSignal, "stop-signal", nil) 428 m["stop-timeout"] = uintFromVarlink(opts.StopTimeout, "stop-timeout", nil) 429 m["storage-opt"] = stringSliceFromVarlink(opts.StorageOpt, "storage-opt", nil) 430 m["subgidname"] = stringFromVarlink(opts.Subgidname, "subgidname", nil) 431 m["subuidname"] = stringFromVarlink(opts.Subuidname, "subuidname", nil) 432 m["sysctl"] = stringSliceFromVarlink(opts.Sysctl, "sysctl", nil) 433 m["systemd"] = stringFromVarlink(opts.Systemd, "systemd", &systemdDefault) 434 m["tmpfs"] = stringSliceFromVarlink(opts.Tmpfs, "tmpfs", nil) 435 m["tty"] = boolFromVarlink(opts.Tty, "tty", false) 436 m["uidmap"] = stringSliceFromVarlink(opts.Uidmap, "uidmap", nil) 437 m["ulimit"] = stringSliceFromVarlink(opts.Ulimit, "ulimit", nil) 438 m["user"] = stringFromVarlink(opts.User, "user", nil) 439 m["userns"] = stringFromVarlink(opts.Userns, "userns", nil) 440 m["uts"] = stringFromVarlink(opts.Uts, "uts", nil) 441 m["mount"] = stringArrayFromVarlink(opts.Mount, "mount", nil) 442 m["volume"] = stringArrayFromVarlink(opts.Volume, "volume", nil) 443 m["volumes-from"] = stringSliceFromVarlink(opts.VolumesFrom, "volumes-from", nil) 444 m["workdir"] = stringFromVarlink(opts.WorkDir, "workdir", nil) 445 446 gcli := GenericCLIResults{m, opts.Args} 447 return gcli 448 } 449 450 // Find returns a flag from a GenericCLIResults by name 451 func (g GenericCLIResults) Find(name string) GenericCLIResult { 452 result, ok := g.results[name] 453 if ok { 454 return result 455 } 456 panic(errors.Errorf("unable to find generic flag for varlink %s", name)) 457 }