~nskaggs/juju-ci-tools/add-essential-operations

« back to all changes in this revision

Viewing changes to fakejuju.py

Merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
108
108
        self.machine_host_names = {}
109
109
        self.current_bundle = None
110
110
        self.model_config = None
 
111
        self.ssh_keys = []
111
112
 
112
113
    @property
113
114
    def state(self):
165
166
        self._clear()
166
167
        self.controller.state = 'model-destroyed'
167
168
 
 
169
    def _fail_stderr(self, message, returncode=1, cmd='juju', stdout=''):
 
170
        exc = subprocess.CalledProcessError(returncode, cmd, stdout)
 
171
        exc.stderr = message
 
172
        raise exc
 
173
 
168
174
    def restore_backup(self):
169
175
        self.controller.require_controller('restore', self.name)
170
176
        if len(self.state_servers) > 0:
171
 
            exc = subprocess.CalledProcessError('Operation not permitted', 1,
172
 
                                                2)
173
 
            exc.stderr = 'Operation not permitted'
174
 
            raise exc
 
177
            return self._fail_stderr('Operation not permitted')
175
178
 
176
179
    def enable_ha(self):
177
180
        self.controller.require_controller('enable-ha', self.name)
235
238
                }
236
239
        return {'machines': machines, 'applications': services}
237
240
 
 
241
    def add_ssh_key(self, keys_to_add):
 
242
        errors = []
 
243
        for key in keys_to_add:
 
244
            if not key.startswith("ssh-rsa "):
 
245
                errors.append(
 
246
                    'cannot add key "{0}": invalid ssh key: {0}'.format(key))
 
247
            elif key in self.ssh_keys:
 
248
                errors.append(
 
249
                    'cannot add key "{0}": duplicate ssh key: {0}'.format(key))
 
250
            else:
 
251
                self.ssh_keys.append(key)
 
252
        return '\n'.join(errors)
 
253
 
 
254
    def remove_ssh_key(self, keys_to_remove):
 
255
        for i in range(len(self.ssh_keys)):
 
256
            if self.ssh_keys[i] in keys_to_remove:
 
257
                keys_to_remove.remove(self.ssh_keys[i])
 
258
                del self.ssh_keys[i]
 
259
        return '\n'.join(
 
260
            'cannot remove key id "{0}": invalid ssh key: {0}'.format(key)
 
261
            for key in keys_to_remove)
 
262
 
 
263
    def import_ssh_key(self, names_to_add):
 
264
        for name in names_to_add:
 
265
            self.ssh_keys.append('ssh-rsa FAKE_KEY a key {}'.format(name))
 
266
        return ""
 
267
 
238
268
 
239
269
class AutoloadCredentials:
240
270
 
537
567
                self.controller_state.add_model(parsed.model_name)
538
568
            if command == 'revoke':
539
569
                user_name = args[2]
540
 
                permissions = args[5]
 
570
                permissions = args[3]
541
571
                per = self.controller_state.users[user_name]['permission']
542
572
                if per == permissions:
543
573
                    if permissions == 'read':
545
575
                        per = ''
546
576
                    else:
547
577
                        per = 'read'
 
578
            if command == 'remove-user':
 
579
                username = args[0]
 
580
                self.controller_state.users.pop(username)
 
581
                if username in self.controller_state.shares:
 
582
                    self.controller_state.shares.remove(username)
548
583
 
549
584
    @contextmanager
550
585
    def juju_async(self, command, args, used_feature_flags,
554
589
                  juju_home, model, timeout=timeout)
555
590
 
556
591
    @check_juju_output
557
 
    def get_juju_output(self, command, args, used_feature_flags,
558
 
                        juju_home, model=None, timeout=None, user_name=None):
 
592
    def get_juju_output(self, command, args, used_feature_flags, juju_home,
 
593
                        model=None, timeout=None, user_name=None,
 
594
                        merge_stderr=False):
559
595
        if 'service' in command:
560
596
            raise Exception('No service')
561
597
        self._log_command(command, args, model, logging.DEBUG)
605
641
        if command == 'create-backup':
606
642
            self.controller_state.require_controller('backup', model)
607
643
            return 'juju-backup-0.tar.gz'
 
644
        if command == 'ssh-keys':
 
645
            lines = ['Keys used in model: ' + model_state.name]
 
646
            if '--full' in args:
 
647
                lines.extend(model_state.ssh_keys)
 
648
            else:
 
649
                lines.extend(':fake:fingerprint: ({})'.format(
 
650
                    k.split(' ', 2)[-1]) for k in model_state.ssh_keys)
 
651
            return '\n'.join(lines)
 
652
        if command == 'add-ssh-key':
 
653
            return model_state.add_ssh_key(args)
 
654
        if command == 'remove-ssh-key':
 
655
            return model_state.remove_ssh_key(args)
 
656
        if command == 'import-ssh-key':
 
657
            return model_state.import_ssh_key(args)
608
658
        return ''
609
659
 
610
660
    def expect(self, command, args, used_feature_flags, juju_home, model=None,