github.com/tompreston/snapd@v0.0.0-20210817193607-954edfcb9611/cmd/snap/cmd_create_cohort.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2019 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package main 21 22 import ( 23 "github.com/jessevdk/go-flags" 24 "gopkg.in/yaml.v2" 25 26 "github.com/snapcore/snapd/i18n" 27 ) 28 29 var shortCreateCohortHelp = i18n.G("Create cohort keys for a set of snaps") 30 var longCreateCohortHelp = i18n.G(` 31 The create-cohort command creates a set of cohort keys for a given set of snaps. 32 33 A cohort is a view or snapshot of a snap's "channel map" at a given point in 34 time that fixes the set of revisions for the snap given other constraints 35 (e.g. channel or architecture). The cohort is then identified by an opaque 36 per-snap key that works across systems. Installations or refreshes of the snap 37 using a given cohort key would use a fixed revision for up to 90 days, after 38 which a new set of revisions would be fixed under that same cohort key and a 39 new 90 days window started. 40 `) 41 42 type cmdCreateCohort struct { 43 clientMixin 44 Positional struct { 45 Snaps []anySnapName `positional-arg-name:"<snap>" required:"1"` 46 } `positional-args:"yes" required:"yes"` 47 } 48 49 func init() { 50 addCommand("create-cohort", shortCreateCohortHelp, longCreateCohortHelp, func() flags.Commander { return &cmdCreateCohort{} }, nil, nil) 51 } 52 53 // output should be YAML, so we use these two as helpers to get that done easy 54 type cohortInnerYAML struct { 55 CohortKey string `yaml:"cohort-key"` 56 } 57 type cohortOutYAML struct { 58 Cohorts map[string]cohortInnerYAML `yaml:"cohorts"` 59 } 60 61 func (x *cmdCreateCohort) Execute(args []string) error { 62 if len(args) > 0 { 63 return ErrExtraArgs 64 } 65 66 snaps := make([]string, len(x.Positional.Snaps)) 67 for i, s := range x.Positional.Snaps { 68 snaps[i] = string(s) 69 } 70 71 cohorts, err := x.client.CreateCohorts(snaps) 72 if len(cohorts) == 0 || err != nil { 73 return err 74 } 75 76 var out cohortOutYAML 77 out.Cohorts = make(map[string]cohortInnerYAML, len(cohorts)) 78 for k, v := range cohorts { 79 out.Cohorts[k] = cohortInnerYAML{v} 80 } 81 82 enc := yaml.NewEncoder(Stdout) 83 defer enc.Close() 84 return enc.Encode(out) 85 }