Skip to content

Commit a251b0b

Browse files
daxmc99Craig Jellick
authored andcommitted
Fix server downloading inactive kontainers
Problem: Server would download drivers even if they were marked inactive. This throws errors on air-gapped installations. Solution: Server now only downloads files when they are marked as active. Modify test to conform to this also. rancher#17595
1 parent 0064039 commit a251b0b

2 files changed

Lines changed: 17 additions & 10 deletions

File tree

pkg/controllers/management/drivers/kontainerdriver/kontainerdriver.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,16 @@ type Lifecycle struct {
5555
func (l *Lifecycle) Create(obj *v3.KontainerDriver) (runtime.Object, error) {
5656
logrus.Infof("create kontainerdriver %v", obj.Name)
5757

58-
v3.KontainerDriverConditionDownloaded.Unknown(obj)
59-
v3.KontainerDriverConditionInstalled.Unknown(obj)
60-
58+
// return early if driver is not active
59+
// set driver to a non-transitioning state
6160
if !obj.Spec.Active {
61+
v3.KontainerDriverConditionInactive.True(obj)
6262
return obj, nil
6363
}
6464

65+
v3.KontainerDriverConditionDownloaded.Unknown(obj)
66+
v3.KontainerDriverConditionInstalled.Unknown(obj)
67+
6568
// Update status
6669
obj, err := l.kontainerDrivers.Update(obj)
6770
if err != nil {
@@ -351,15 +354,17 @@ func (l *Lifecycle) Updated(obj *v3.KontainerDriver) (runtime.Object, error) {
351354
return obj, l.updateDynamicSchema(obj)
352355
}
353356

354-
// redownload file if url changed or not downloaded
357+
// redownload file if active AND url changed or not downloaded
358+
// prevents downloading on air-gapped installations
355359
var err error
356-
if obj.Spec.URL != obj.Status.ActualURL || v3.KontainerDriverConditionDownloaded.IsFalse(obj) || !l.driverExists(obj) {
360+
if obj.Spec.Active && (obj.Spec.URL != obj.Status.ActualURL || v3.KontainerDriverConditionDownloaded.IsFalse(obj) || !l.driverExists(obj)) {
357361
obj, err = l.download(obj)
358362
if err != nil {
359363
return nil, err
360364
}
361365
}
362-
366+
// Create schema if obj is active
367+
// Delete schema if obj is inactive
363368
if obj.Spec.Active {
364369
err = l.createDynamicSchema(obj)
365370

@@ -368,7 +373,6 @@ func (l *Lifecycle) Updated(obj *v3.KontainerDriver) (runtime.Object, error) {
368373
if err = l.dynamicSchemas.Delete(getDynamicTypeName(obj), &v13.DeleteOptions{}); err != nil && !errors.IsNotFound(err) {
369374
return nil, fmt.Errorf("error deleting schema: %v", err)
370375
}
371-
372376
if err = l.removeFieldFromCluster(obj); err != nil {
373377
return nil, err
374378
}
@@ -424,6 +428,7 @@ func (l *Lifecycle) Remove(obj *v3.KontainerDriver) (runtime.Object, error) {
424428
return obj, nil
425429
}
426430

431+
// Removes the v3/dynamicschema "cluster"'s resourceField associated with the KontainerDriver obj
427432
func (l *Lifecycle) removeFieldFromCluster(obj *v3.KontainerDriver) error {
428433
nodedriver.SchemaLock.Lock()
429434
defer nodedriver.SchemaLock.Unlock()
@@ -432,7 +437,7 @@ func (l *Lifecycle) removeFieldFromCluster(obj *v3.KontainerDriver) error {
432437

433438
nodeSchema, err := l.dynamicSchemasLister.Get("", "cluster")
434439
if err != nil {
435-
return fmt.Errorf("error getting schema: %v", err)
440+
return fmt.Errorf("error getting schema: %v", err) // this error may fire during Rancher startup
436441
}
437442

438443
nodeSchema = nodeSchema.DeepCopy()

tests/core/test_kontainer_drivers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,16 @@ def test_kontainer_driver_lifecycle(admin_mc, remove_resource):
6464

6565
@pytest.mark.nonparallel
6666
def test_enabling_driver_exposes_schema(admin_mc, remove_resource):
67+
""" Test if enabling driver exposes its dynamic schema, drivers are
68+
downloaded / installed once they are active """
6769
kd = admin_mc.client.create_kontainerDriver(
6870
createDynamicSchema=True,
6971
active=False,
7072
url=DRIVER_URL
7173
)
7274
remove_resource(kd)
7375

74-
kd = wait_for_condition('Installed', 'True', admin_mc.client, kd,
76+
kd = wait_for_condition('Inactive', 'True', admin_mc.client, kd,
7577
timeout=90)
7678

7779
# verify the kontainer driver has no activate and a deactivate link
@@ -81,7 +83,7 @@ def test_enabling_driver_exposes_schema(admin_mc, remove_resource):
8183

8284
verify_driver_not_in_types(admin_mc.client, kd)
8385

84-
kd.active = True
86+
kd.active = True # driver should begin downloading / installing
8587
admin_mc.client.update_by_id_kontainerDriver(kd.id, kd)
8688

8789
kd = wait_for_condition('Active', 'True', admin_mc.client, kd,

0 commit comments

Comments
 (0)