class RosterEntryConfig(Schema): ''' Schema definition of a Salt SSH Roster entry ''' title = 'Roster Entry' description = 'Salt SSH roster entry definition' host = StringItem( title='Host', description='The IP address or DNS name of the remote host', # Pretty naive pattern matching pattern= r'^((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|([A-Za-z0-9][A-Za-z0-9\.\-]{1,255}))$', min_length=1, required=True) port = PortItem(title='Port', description='The target system\'s ssh port number', default=22) user = StringItem(title='User', description='The user to log in as. Defaults to root', default='root', min_length=1, required=True) passwd = SecretItem(title='Password', description='The password to log in with', min_length=1) priv = StringItem( title='Private Key', description='File path to ssh private key, defaults to salt-ssh.rsa', min_length=1) priv_passwd = SecretItem(title='Private Key passphrase', description='Passphrase for private key file', min_length=1) passwd_or_priv_requirement = AnyOfItem( items=(RequirementsItem(requirements=['passwd']), RequirementsItem(requirements=['priv'])))(flatten=True) sudo = BooleanItem(title='Sudo', description='run command via sudo. Defaults to False', default=False) timeout = IntegerItem( title='Timeout', description=('Number of seconds to wait for response ' 'when establishing an SSH connection')) thin_dir = StringItem( title='Thin Directory', description=('The target system\'s storage directory for Salt ' 'components. Defaults to /tmp/salt-<hash>.')) minion_opts = DictItem(title='Minion Options', description='Dictionary of minion options', properties=MinionConfiguration())
def test_config(self): config = ssh_schemas.RosterEntryConfig() expected = { '$schema': 'http://json-schema.org/draft-04/schema#', 'title': 'Roster Entry', 'description': 'Salt SSH roster entry definition', 'type': 'object', 'properties': { 'host': { 'title': 'Host', 'description': 'The IP address or DNS name of the remote host', 'type': 'string', 'pattern': r'^((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|([A-Za-z0-9][A-Za-z0-9\.\-]{1,255}))$', 'minLength': 1 }, 'port': { 'description': 'The target system\'s ssh port number', 'title': 'Port', 'default': 22, 'maximum': 65535, 'minimum': 0, 'type': 'integer' }, 'user': { 'default': 'root', 'type': 'string', 'description': 'The user to log in as. Defaults to root', 'title': 'User', 'minLength': 1 }, 'passwd': { 'title': 'Password', 'type': 'string', 'description': 'The password to log in with', 'format': 'secret', 'minLength': 1 }, 'priv': { 'type': 'string', 'description': 'File path to ssh private key, defaults to salt-ssh.rsa', 'title': 'Private Key', 'minLength': 1 }, 'priv_passwd': { 'type': 'string', 'description': 'Passphrase for private key file', 'title': 'Private Key passphrase', 'format': 'secret', 'minLength': 1, }, 'sudo': { 'default': False, 'type': 'boolean', 'description': 'run command via sudo. Defaults to False', 'title': 'Sudo' }, 'timeout': { 'type': 'integer', 'description': 'Number of seconds to wait for response when establishing an SSH connection', 'title': 'Timeout' }, 'thin_dir': { 'type': 'string', 'description': 'The target system\'s storage directory for Salt components. Defaults to /tmp/salt-<hash>.', 'title': 'Thin Directory' }, # The actuall representation of the minion options would make this HUGE! 'minion_opts': ssh_schemas.DictItem(title='Minion Options', description='Dictionary of minion options', properties=MinionConfiguration()).serialize(), }, 'anyOf': [ { 'required': [ 'passwd' ] }, { 'required': [ 'priv' ] } ], 'required': [ 'host', 'user', ], 'x-ordering': [ 'host', 'port', 'user', 'passwd', 'priv', 'priv_passwd', 'sudo', 'timeout', 'thin_dir', 'minion_opts' ], 'additionalProperties': False } try: self.assertDictContainsSubset(expected['properties'], config.serialize()['properties']) self.assertDictContainsSubset(expected, config.serialize()) except AssertionError: import salt.utils.json print(salt.utils.json.dumps(config.serialize(), indent=4)) raise
def test_config(self): config = ssh_schemas.RosterEntryConfig() expected = { "$schema": "http://json-schema.org/draft-04/schema#", "title": "Roster Entry", "description": "Salt SSH roster entry definition", "type": "object", "properties": { "host": { "title": "Host", "description": "The IP address or DNS name of the remote host", "type": "string", "pattern": r"^((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|([A-Za-z0-9][A-Za-z0-9\.\-]{1,255}))$", "minLength": 1, }, "port": { "description": "The target system's ssh port number", "title": "Port", "default": 22, "maximum": 65535, "minimum": 0, "type": "integer", }, "user": { "default": "root", "type": "string", "description": "The user to log in as. Defaults to root", "title": "User", "minLength": 1, }, "passwd": { "title": "Password", "type": "string", "description": "The password to log in with", "format": "secret", "minLength": 1, }, "priv": { "type": "string", "description": "File path to ssh private key, defaults to salt-ssh.rsa", "title": "Private Key", "minLength": 1, }, "priv_passwd": { "type": "string", "description": "Passphrase for private key file", "title": "Private Key passphrase", "format": "secret", "minLength": 1, }, "sudo": { "default": False, "type": "boolean", "description": "run command via sudo. Defaults to False", "title": "Sudo", }, "timeout": { "type": "integer", "description": "Number of seconds to wait for response when establishing an SSH connection", "title": "Timeout", }, "thin_dir": { "type": "string", "description": "The target system's storage directory for Salt components. Defaults to /tmp/salt-<hash>.", "title": "Thin Directory", }, # The actuall representation of the minion options would make this HUGE! "minion_opts": ssh_schemas.DictItem( title="Minion Options", description="Dictionary of minion options", properties=MinionConfiguration(), ).serialize(), }, "anyOf": [{"required": ["passwd"]}, {"required": ["priv"]}], "required": ["host", "user"], "x-ordering": [ "host", "port", "user", "passwd", "priv", "priv_passwd", "sudo", "timeout", "thin_dir", "minion_opts", ], "additionalProperties": False, } try: self.assertDictContainsSubset( expected["properties"], config.serialize()["properties"] ) self.assertDictContainsSubset(expected, config.serialize()) except AssertionError: import salt.utils.json print(salt.utils.json.dumps(config.serialize(), indent=4)) raise
class RosterEntryConfig(Schema): """ Schema definition of a Salt SSH Roster entry """ title = "Roster Entry" description = "Salt SSH roster entry definition" host = StringItem( title="Host", description="The IP address or DNS name of the remote host", # Pretty naive pattern matching pattern= r"^((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|([A-Za-z0-9][A-Za-z0-9\.\-]{1,255}))$", min_length=1, required=True, ) port = PortItem(title="Port", description="The target system's ssh port number", default=22) user = StringItem( title="User", description="The user to log in as. Defaults to root", default="root", min_length=1, required=True, ) passwd = SecretItem(title="Password", description="The password to log in with", min_length=1) priv = StringItem( title="Private Key", description="File path to ssh private key, defaults to salt-ssh.rsa", min_length=1, ) priv_passwd = SecretItem( title="Private Key passphrase", description="Passphrase for private key file", min_length=1, ) passwd_or_priv_requirement = AnyOfItem(items=( RequirementsItem(requirements=["passwd"]), RequirementsItem(requirements=["priv"]), ))(flatten=True) sudo = BooleanItem( title="Sudo", description="run command via sudo. Defaults to False", default=False, ) timeout = IntegerItem( title="Timeout", description=("Number of seconds to wait for response " "when establishing an SSH connection"), ) thin_dir = StringItem( title="Thin Directory", description=("The target system's storage directory for Salt " "components. Defaults to /tmp/salt-<hash>."), ) minion_opts = DictItem( title="Minion Options", description="Dictionary of minion options", properties=MinionConfiguration(), )