Skip to content
This repository was archived by the owner on Feb 4, 2022. It is now read-only.

Commit efc2dc6

Browse files
authored
Merge pull request juju#12770 from wallyworld/merge-2.9-20210316
juju#12770 Merge 2.9 juju#12735 Silences proxy log messages from klog juju#12742 Fixes broken kubeconfig loading tests juju#12754 Record hostname when machine agent starts juju#12755 Fix broken centos proxy tests part2 juju#12756 Update github.com/juju/charm/v7 to include v2 block juju#12757 Disable tests/run.sh for released bundle test and dump logs juju#12739 Scaffold upgrade series logic juju#12753 Disregard refcount for blobstore cleanup juju#12758 No panic missing bundle app body juju#12759 Fix errant relative timeout for migration minion reports juju#12760 Include hostname in multi-watcher machine deltas juju#12750 Refactor series support to that juju itself can set its own supported series ``` # Conflicts: # apiserver/allfacades.go # apiserver/facades/agent/machine/machiner.go # apiserver/facades/client/client/client.go # apiserver/facades/schema.json # caas/kubernetes/provider/cloud.go # cloudconfig/userdatacfg_unix.go # cmd/juju/commands/bootstrap_test.go # state/migration_internal_test.go ``` ## QA steps See PRs
2 parents a4e7c05 + d70615b commit efc2dc6

File tree

170 files changed

+3858
-1000
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

170 files changed

+3858
-1000
lines changed

acceptancetests/assess_caas_deploy_kubeflow.py

+53-13
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,13 @@ def prepare(caas_client, caas_provider, build):
340340
)
341341

342342

343-
def run_test(caas_provider, k8s_model, bundle):
343+
def run_test(caas_provider, k8s_model, bundle, build):
344344
if caas_provider != K8sProviderType.MICROK8S.name:
345345
# tests/run.sh only works for microk8s.
346-
log.info("%s/tests/run.sh skipped for %s k8s provider", KUBEFLOW_DIR, caas_provider)
346+
log.info("%s/tests/run.sh is skipped for %s k8s provider", KUBEFLOW_DIR, caas_provider)
347+
return
348+
if not build:
349+
log.info("%s/tests/run.sh is skipped for released bundle", KUBEFLOW_DIR)
347350
return
348351
# inject `JUJU_DATA` for running tests.
349352
os.environ['JUJU_DATA'] = k8s_model.env.juju_home
@@ -352,25 +355,58 @@ def run_test(caas_provider, k8s_model, bundle):
352355
run("sg", "microk8s", "-c", f"{KUBEFLOW_DIR}/tests/run.sh -m {bundle}")
353356

354357

355-
def assess_caas_kubeflow_deployment(caas_client, caas_provider, bundle, build=False):
358+
def dump_k8s_log(artifacts_dir, file_name, content):
359+
if not os.path.isdir(artifacts_dir):
360+
os.mkdir(artifacts_dir)
361+
362+
path = os.path.join(artifacts_dir, file_name)
363+
if os.path.isfile(path):
364+
raise Exception(f'{path} already exists')
365+
with open(path, 'w') as f:
366+
f.write(content)
367+
368+
369+
def dump_containers_log(model_name, kubectl, dump_log):
370+
for pod in json.loads(kubectl('get', 'pods', '-n', model_name, '-o', 'json'))['items']:
371+
for container in pod['spec']['containers']:
372+
pod_name = pod['metadata']['name']
373+
container_name = container['name']
374+
log = kubectl('-n', model_name, 'logs', '--timestamps', pod_name, '-c', container_name)
375+
dump_log(f'{pod_name}-{container_name}.log', log)
376+
377+
378+
def assess_caas_kubeflow_deployment(caas_client, caas_provider, bundle, build=False, log_dir=None):
356379
if not caas_client.check_cluster_healthy(timeout=60):
357380
raise JujuAssertionError('k8s cluster is not healthy because kubectl is not accessible')
358381

359382
model_name = 'kubeflow'
360383
k8s_model = caas_client.add_model(model_name)
361384

385+
def dump_log(file_name, content): dump_k8s_log(os.path.join(log_dir, model_name), file_name, content)
386+
362387
def success_hook():
363-
log.info(caas_client.kubectl('get', 'all,pv,pvc,ing', '--all-namespaces', '-o', 'wide'))
364-
log.info(caas_client.kubectl('get', 'sa,roles,clusterroles,rolebindings,clusterrolebindings', '-oyaml', '-A'))
388+
dump_log(
389+
'all_pv_pvc_ing.txt',
390+
caas_client.kubectl('get', 'all,pv,pvc,ing', '--all-namespaces', '-o', 'wide'),
391+
)
392+
dump_log(
393+
'sa_roles_clusterroles_rolebindings_clusterrolebindings.yaml',
394+
caas_client.kubectl('get', 'sa,roles,clusterroles,rolebindings,clusterrolebindings', '-oyaml', '-A'),
395+
)
365396

366397
def fail_hook():
367398
success_hook()
368-
ns_dumps = caas_client.kubectl('get', 'all,pv,pvc,ing', '-n', model_name, '-o', 'json')
369-
log.info('all resources in namespace %s -> %s', model_name, pformat(json.loads(ns_dumps)))
370-
371-
log.info(
372-
'describing pods in %s ->\n%s',
373-
model_name, caas_client.kubectl('describe', 'pods', f'-n{model_name}'),
399+
dump_log(
400+
f'all_pv_pvc_ing_{model_name}.yaml',
401+
caas_client.kubectl('get', 'all,pv,pvc,ing', '-n', model_name, '-o', 'yaml'),
402+
)
403+
dump_log(
404+
f'describe_pods_{model_name}.txt',
405+
caas_client.kubectl('describe', 'pods', f'-n{model_name}'),
406+
)
407+
dump_containers_log(
408+
model_name,
409+
caas_client.kubectl, dump_log,
374410
)
375411
caas_client.ensure_cleanup()
376412

@@ -380,7 +416,7 @@ def fail_hook():
380416
log.info("sleeping for 30 seconds to let everything start up")
381417
sleep(30)
382418

383-
run_test(caas_provider, k8s_model, bundle)
419+
run_test(caas_provider, k8s_model, bundle, build)
384420
k8s_model.juju(k8s_model._show_status, ('--format', 'tabular'))
385421
success_hook()
386422
except: # noqa: E722
@@ -445,7 +481,11 @@ def main(argv=None):
445481
if not args.k8s_controller:
446482
# add-k8s to controller
447483
caas_client.add_k8s(False)
448-
assess_caas_kubeflow_deployment(caas_client, args.caas_provider, args.bundle, args.build)
484+
assess_caas_kubeflow_deployment(
485+
caas_client,
486+
args.caas_provider, args.bundle, args.build,
487+
bs_manager.log_dir,
488+
)
449489
return 0
450490

451491

api/facadeversions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ var facadeVersions = map[string]int{
7070
"MachineActions": 1,
7171
"MachineManager": 6,
7272
"MachineUndertaker": 1,
73-
"Machiner": 4,
73+
"Machiner": 5,
7474
"MeterStatus": 2,
7575
"MetricsAdder": 2,
7676
"MetricsDebug": 2,

api/imagemetadatamanager/client_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import (
77
"regexp"
88

99
"github.com/juju/errors"
10-
"github.com/juju/os/v2/series"
1110
jc "github.com/juju/testing/checkers"
1211
gc "gopkg.in/check.v1"
1312

1413
"github.com/juju/juju/api/base/testing"
1514
"github.com/juju/juju/api/imagemetadatamanager"
1615
"github.com/juju/juju/apiserver/params"
16+
"github.com/juju/juju/core/series"
1717
coretesting "github.com/juju/juju/testing"
1818
)
1919

api/machiner/machine.go

+25-9
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,35 @@ func (m *Machine) SetObservedNetworkConfig(netConfig []params.NetworkConfig) err
125125
return nil
126126
}
127127

128-
// RecordAgentStartTime updates the start time for the agent running on the
129-
// machine.
130-
func (m *Machine) RecordAgentStartTime() error {
128+
// RecordAgentStartInformation reports the host name of the machine and updates
129+
// the start time for the agent.
130+
func (m *Machine) RecordAgentStartInformation(hostname string) error {
131+
var (
132+
result params.ErrorResults
133+
err error
134+
)
135+
136+
switch {
131137
// Ignore if connecting to an older, not upgraded controller
132-
if m.st.facade.BestAPIVersion() < 2 {
138+
case m.st.facade.BestAPIVersion() < 2:
133139
return nil
140+
case m.st.facade.BestAPIVersion() < 5: // Only supports RecordAgentStartTime
141+
args := params.Entities{
142+
Entities: []params.Entity{{Tag: m.tag.String()}},
143+
}
144+
err = m.st.facade.FacadeCall("RecordAgentStartTime", args, &result)
145+
default: // Supports RecordAgentStartInformation
146+
args := params.RecordAgentStartInformationArgs{
147+
Args: []params.RecordAgentStartInformationArg{
148+
{
149+
Tag: m.tag.String(),
150+
Hostname: hostname,
151+
},
152+
},
153+
}
154+
err = m.st.facade.FacadeCall("RecordAgentStartInformation", args, &result)
134155
}
135156

136-
var result params.ErrorResults
137-
args := params.Entities{
138-
Entities: []params.Entity{{Tag: m.tag.String()}},
139-
}
140-
err := m.st.facade.FacadeCall("RecordAgentStartTime", args, &result)
141157
if err != nil {
142158
return err
143159
}

api/machiner/machiner_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func (s *machinerSuite) TestWatch(c *gc.C) {
208208
wc.AssertOneChange()
209209
}
210210

211-
func (s *machinerSuite) TestRecordAgentStartTime(c *gc.C) {
211+
func (s *machinerSuite) TestRecordAgentStartInformation(c *gc.C) {
212212
mTag := names.NewMachineTag("1")
213213
stMachine, err := s.State.Machine(mTag.Id())
214214
c.Assert(err, jc.ErrorIsNil)
@@ -217,11 +217,12 @@ func (s *machinerSuite) TestRecordAgentStartTime(c *gc.C) {
217217
machine, err := s.machiner.Machine(mTag)
218218
c.Assert(err, jc.ErrorIsNil)
219219

220-
err = machine.RecordAgentStartTime()
220+
err = machine.RecordAgentStartInformation("thundering-herds")
221221
c.Assert(err, jc.ErrorIsNil)
222222

223223
err = stMachine.Refresh()
224224
c.Assert(err, jc.ErrorIsNil)
225225

226226
c.Assert(stMachine.AgentStartTime(), gc.Not(gc.Equals), oldStartedAt, gc.Commentf("expected the agent start time to be updated"))
227+
c.Assert(stMachine.Hostname(), gc.Equals, "thundering-herds", gc.Commentf("expected for the recorded machine hostname to be updated"))
227228
}

apiserver/allfacades.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ func AllFacades() *facade.Registry {
234234
reg("MachineManager", 6, machinemanager.NewFacadeV6) // DestroyMachinesWithParams gains maxWait.
235235

236236
reg("MachineUndertaker", 1, machineundertaker.NewFacade)
237-
reg("Machiner", 4, machine.NewMachinerAPI) // Removes SetProviderNetworkConfig.
237+
reg("Machiner", 5, machine.NewMachinerAPI) // Removes SetProviderNetworkConfig, adds RecordAgentHostAndStartTime.
238238

239239
reg("MeterStatus", 1, meterstatus.NewMeterStatusFacadeV1)
240240
reg("MeterStatus", 2, meterstatus.NewMeterStatusFacade)

apiserver/authentication/agent.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"github.com/juju/juju/state"
1515
)
1616

17-
// AgentIdentityProvider performs authentication for machine and unit agents.
17+
// AgentAuthenticator performs authentication for machine and unit agents.
1818
type AgentAuthenticator struct{}
1919

2020
var _ EntityAuthenticator = (*AgentAuthenticator)(nil)

apiserver/facades/agent/machine/machiner.go

+25-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,31 @@ func (api *MachinerAPI) RecordAgentStartTime(args params.Entities) (params.Error
156156
results.Results[i].Error = apiservererrors.ServerError(err)
157157
continue
158158
}
159-
if err := m.RecordAgentStartTime(); err != nil {
159+
if err := m.RecordAgentStartInformation(""); err != nil {
160+
results.Results[i].Error = apiservererrors.ServerError(err)
161+
}
162+
}
163+
return results, nil
164+
}
165+
166+
// RecordAgentStartInformation syncs the machine model with information
167+
// reported by a machine agent when it starts.
168+
func (api *MachinerAPI) RecordAgentStartInformation(args params.RecordAgentStartInformationArgs) (params.ErrorResults, error) {
169+
results := params.ErrorResults{
170+
Results: make([]params.ErrorResult, len(args.Args)),
171+
}
172+
canModify, err := api.getCanModify()
173+
if err != nil {
174+
return results, err
175+
}
176+
177+
for i, arg := range args.Args {
178+
m, err := api.getMachine(arg.Tag, canModify)
179+
if err != nil {
180+
results.Results[i].Error = apiservererrors.ServerError(err)
181+
continue
182+
}
183+
if err := m.RecordAgentStartInformation(arg.Hostname); err != nil {
160184
results.Results[i].Error = apiservererrors.ServerError(err)
161185
}
162186
}

apiserver/facades/agent/machine/machiner_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -291,3 +291,25 @@ func (s *machinerSuite) TestWatch(c *gc.C) {
291291
wc := statetesting.NewNotifyWatcherC(c, s.State, resource.(state.NotifyWatcher))
292292
wc.AssertNoChange()
293293
}
294+
295+
func (s *machinerSuite) TestRecordAgentStartInformation(c *gc.C) {
296+
args := params.RecordAgentStartInformationArgs{Args: []params.RecordAgentStartInformationArg{
297+
{Tag: "machine-1", Hostname: "thundering-herds"},
298+
{Tag: "machine-0", Hostname: "eldritch-octopii"},
299+
{Tag: "machine-42", Hostname: "missing-gem"},
300+
}}
301+
302+
result, err := s.machiner.RecordAgentStartInformation(args)
303+
c.Assert(err, jc.ErrorIsNil)
304+
c.Assert(result, gc.DeepEquals, params.ErrorResults{
305+
Results: []params.ErrorResult{
306+
{nil},
307+
{apiservertesting.ErrUnauthorized},
308+
{apiservertesting.ErrUnauthorized},
309+
},
310+
})
311+
312+
err = s.machine1.Refresh()
313+
c.Assert(err, jc.ErrorIsNil)
314+
c.Assert(s.machine1.Hostname(), gc.Equals, "thundering-herds", gc.Commentf("expected the machine hostname to be updated"))
315+
}

apiserver/facades/agent/provisioner/provisioninginfo.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/juju/collections/set"
1212
"github.com/juju/errors"
1313
"github.com/juju/names/v4"
14-
"github.com/juju/os/v2/series"
1514

1615
"github.com/juju/juju/apiserver/common/storagecommon"
1716
apiservererrors "github.com/juju/juju/apiserver/errors"
@@ -20,6 +19,7 @@ import (
2019
"github.com/juju/juju/core/lxdprofile"
2120
"github.com/juju/juju/core/model"
2221
"github.com/juju/juju/core/network"
22+
"github.com/juju/juju/core/series"
2323
"github.com/juju/juju/environs"
2424
"github.com/juju/juju/environs/imagemetadata"
2525
"github.com/juju/juju/environs/simplestreams"
@@ -607,7 +607,7 @@ func (api *ProvisionerAPI) constructImageConstraint(m *state.Machine, env enviro
607607
lookup.CloudSpec = spec
608608
}
609609

610-
return imagemetadata.NewImageConstraint(lookup), nil
610+
return imagemetadata.NewImageConstraint(lookup)
611611
}
612612

613613
// findImageMetadata returns all image metadata or an error fetching them.

apiserver/facades/client/bundle/bundle.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"github.com/juju/errors"
1919
"github.com/juju/loggo"
2020
"github.com/juju/names/v4"
21-
"github.com/juju/os/v2/series"
2221
"gopkg.in/yaml.v2"
2322

2423
"github.com/juju/juju/apiserver/common"
@@ -31,6 +30,7 @@ import (
3130
"github.com/juju/juju/core/network"
3231
"github.com/juju/juju/core/network/firewall"
3332
"github.com/juju/juju/core/permission"
33+
"github.com/juju/juju/core/series"
3434
"github.com/juju/juju/state"
3535
"github.com/juju/juju/storage"
3636
)

apiserver/facades/client/client/client.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import (
1111
"github.com/juju/errors"
1212
"github.com/juju/loggo"
1313
"github.com/juju/names/v4"
14-
"github.com/juju/os/v2"
15-
"github.com/juju/os/v2/series"
1614
"github.com/juju/replicaset/v2"
1715
"github.com/juju/version"
1816

@@ -29,7 +27,9 @@ import (
2927
"github.com/juju/juju/core/life"
3028
"github.com/juju/juju/core/multiwatcher"
3129
"github.com/juju/juju/core/network"
30+
"github.com/juju/juju/core/os"
3231
"github.com/juju/juju/core/permission"
32+
"github.com/juju/juju/core/series"
3333
"github.com/juju/juju/environs"
3434
"github.com/juju/juju/environs/config"
3535
"github.com/juju/juju/environs/context"

apiserver/facades/client/client/status.go

+1
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,7 @@ func (c *statusContext) makeMachineStatus(machine *state.Machine, appStatusInfo
10111011
logger.Debugf("error fetching public address: %q", err)
10121012
}
10131013
status.DNSName = addr.Value
1014+
status.Hostname = machine.Hostname()
10141015
mAddrs := machine.Addresses()
10151016
if len(mAddrs) == 0 {
10161017
logger.Debugf("no IP addresses fetched for machine %q", instid)

apiserver/facades/client/machinemanager/instance_information_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ func (p *instanceTypesSuite) TestInstanceTypes(c *gc.C) {
6262
api, err := machinemanager.NewMachineManagerAPI(backend,
6363
backend,
6464
pool,
65-
authorizer,
66-
backend.ModelTag(),
65+
machinemanager.ModelAuthorizer{
66+
Authorizer: authorizer,
67+
ModelTag: backend.ModelTag(),
68+
},
6769
context.NewCloudCallContext(),
6870
common.NewResources(),
6971
leadership,

0 commit comments

Comments
 (0)