soar-registry-directory 4.0.5 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -1
- data/lib/soar/registry/directory/error.rb +2 -1
- data/lib/soar/registry/directory/model.rb +10 -9
- data/lib/soar/registry/directory/provider/dynamo_db.rb +42 -23
- data/lib/soar/registry/directory/provider/ldap.rb +37 -14
- data/lib/soar/registry/directory/provider/mysql.rb +27 -16
- data/lib/soar/registry/directory/provider/stub.rb +19 -14
- data/lib/soar/registry/directory/test/fixtures/entries.json +49 -43
- data/lib/soar/registry/directory/test/fixtures/table_structure.json +17 -10
- data/lib/soar/registry/directory/test/orchestrator.rb +8 -0
- data/lib/soar/registry/directory/test/provider/dynamo_db.rb +31 -11
- data/lib/soar/registry/directory/test/provider/ldap.rb +21 -8
- data/lib/soar/registry/directory/test/provider/mysql.rb +17 -7
- data/lib/soar/registry/directory/test/provider/stub.rb +18 -8
- metadata +2 -3
- data/lib/soar/registry/directory/test/fixtures/entries.ldif +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7534aad40030456e9a4b9fc88d8a58d52e2817a
|
4
|
+
data.tar.gz: 1afbcb2d7d1a1441eb2e0e5067399c237e3fb19f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ba850d7503dffb59cf24d74eff42a43acdb1b145d4920b7e2b053bfcbbf449d8c7ddc76986575b6b4725251b1fe867b3201c54275bd9729bfb9de6ff9337d7d
|
7
|
+
data.tar.gz: f567f1b47129a1a61997af5b08f29e19c12671dead9e6d8a38974847fa282d6701c4df17fe1709661c3d7f13f7e304953c9ad05a31513c8ab326f64fa017c1eb
|
data/README.md
CHANGED
@@ -34,7 +34,9 @@ Create an instance of the stub provider by passing in the name, primary key and
|
|
34
34
|
password: "secret"
|
35
35
|
},
|
36
36
|
table: "mytable",
|
37
|
-
index:
|
37
|
+
index:
|
38
|
+
partition_key: 'uuid',
|
39
|
+
sort_key: 'role'
|
38
40
|
config: {
|
39
41
|
region: 'us-west-2'
|
40
42
|
endpoint: 'http://localhost:8000'
|
@@ -116,6 +118,7 @@ $ cucumber
|
|
116
118
|
```bash
|
117
119
|
docker-compose --file docker-compose.stub.yml --project-name soar-registry-directory-provider-stub up --abort-on-container-exit --remove-orphans --build --force-recreate
|
118
120
|
EXIT_CODE=$(docker ps -a -f "name=soarregistrydirectoryproviderstub_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}")
|
121
|
+
docker-compose --file docker-compose.stub.yml --project-name soar-registry-directory-provider-stub down --rmi local
|
119
122
|
exit $EXIT_CODE
|
120
123
|
```
|
121
124
|
|
@@ -125,12 +128,14 @@ exit $EXIT_CODE
|
|
125
128
|
```bash
|
126
129
|
$ docker-compose --file docker-compose.dynamo_db.yml up --remove-orphans
|
127
130
|
$ CONFIG_FILE=config.dynamo_db.yml TEST_ORCHESTRATION_PROVIDER=DynamoDb cucumber
|
131
|
+
$ docker-compose --file docker-compose.dynamo_db.yml down local
|
128
132
|
```
|
129
133
|
|
130
134
|
#### CI
|
131
135
|
```bash
|
132
136
|
docker-compose --file docker-compose.ci.dynamo_db.yml --project-name soar-registry-directory-provider-dynamo_db up --abort-on-container-exit --remove-orphans --build --force-recreate
|
133
137
|
EXIT_CODE=$(docker ps -a -f "name=soarregistrydirectoryproviderdynamodb_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}")
|
138
|
+
docker-compose --file docker-compose.ci.dynamo_db.yml --project-name soar-registry-directory-provider-dynamo_db down --rmi local
|
134
139
|
exit $EXIT_CODE
|
135
140
|
```
|
136
141
|
|
@@ -140,12 +145,14 @@ exit $EXIT_CODE
|
|
140
145
|
```bash
|
141
146
|
$ docker-compose --file docker-compose.ldap.yml up --remove-orphans
|
142
147
|
$ CONFIG_FILE=config.ldap.yml TEST_ORCHESTRATION_PROVIDER=Ldap cucumber
|
148
|
+
$ docker-compose --file docker-compose.ldap.yml down local
|
143
149
|
```
|
144
150
|
|
145
151
|
#### CI
|
146
152
|
```bash
|
147
153
|
docker-compose --file docker-compose.ci.ldap.yml --project-name soar-registry-directory-provider-ldap up --abort-on-container-exit --remove-orphans --build --force-recreate
|
148
154
|
EXIT_CODE=$(docker ps -a -f "name=soarregistrydirectoryproviderldap_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}")
|
155
|
+
docker-compose --file docker-compose.ci.ldap.yml --project-name soar-registry-directory-provider-ldap down --rmi local
|
149
156
|
exit $EXIT_CODE
|
150
157
|
```
|
151
158
|
|
@@ -155,12 +162,14 @@ exit $EXIT_CODE
|
|
155
162
|
```bash
|
156
163
|
$ docker-compose --file docker-compose.mysql.yml up --remove-orphans
|
157
164
|
$ CONFIG_FILE=config.mysql.yml TEST_ORCHESTRATION_PROVIDER=Mysql cucumber
|
165
|
+
$ docker-compose --file docker-compose.mysql.yml down --rmi local
|
158
166
|
```
|
159
167
|
|
160
168
|
#### CI
|
161
169
|
```bash
|
162
170
|
docker-compose --file docker-compose.ci.mysql.yml --project-name soar-registry-directory-provider-mysql up --abort-on-container-exit --remove-orphans --build --force-recreate
|
163
171
|
EXIT_CODE=$(docker ps -a -f "name=soarregistrydirectoryprovidermysql_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}")
|
172
|
+
docker-compose --file docker-compose.ci.mysql.yml --project-name soar-registry-directory-provider-mysql down --rmi local
|
164
173
|
exit $EXIT_CODE
|
165
174
|
```
|
166
175
|
|
@@ -2,9 +2,10 @@ module Soar
|
|
2
2
|
module Registry
|
3
3
|
module Directory
|
4
4
|
module Error
|
5
|
-
class
|
5
|
+
class NoEntriesFoundError < StandardError; end;
|
6
6
|
class MultipleEntriesFound < StandardError; end;
|
7
7
|
class NetworkingError < StandardError; end;
|
8
|
+
class DuplicateEntryError < StandardError; end;
|
8
9
|
end
|
9
10
|
end
|
10
11
|
end
|
@@ -12,23 +12,24 @@ module Soar
|
|
12
12
|
attr_reader :provider
|
13
13
|
|
14
14
|
##
|
15
|
-
# @param
|
15
|
+
# @param [Soar::Registry::Directory::Provider::Stub, Soar::Registry::Directory::Provider::DynamoDb, Soar::Registry::Directory::Provider::Ldap, Soar::Registry::Directory::Provider::Mysql] provider
|
16
16
|
##
|
17
17
|
def initialize(provider)
|
18
18
|
@provider = provider
|
19
19
|
end
|
20
20
|
|
21
21
|
##
|
22
|
-
# @param
|
23
|
-
# @
|
22
|
+
# @param [Hash] entity
|
23
|
+
# @return [Boolean]
|
24
|
+
# @raise [Soar::Registry::Directory::Error::NetworkingError, Soar::Registry::Directory::Error::DuplicateEntryError]
|
24
25
|
##
|
25
26
|
def put(entity)
|
26
27
|
@provider.put(entity)
|
27
28
|
end
|
28
29
|
|
29
30
|
##
|
30
|
-
# @param
|
31
|
-
# @return [Hash]
|
31
|
+
# @param [String] primary_key
|
32
|
+
# @return [Hash] entry
|
32
33
|
# @raise [Soar::Registry:::Directory::Error::NoEntriesFound] if primary key not found
|
33
34
|
# @raise [Soar::Registry::Directory::Error::NetworkingError]
|
34
35
|
##
|
@@ -37,17 +38,17 @@ module Soar
|
|
37
38
|
end
|
38
39
|
|
39
40
|
##
|
40
|
-
# @param
|
41
|
-
# @param
|
41
|
+
# @param [String] key
|
42
|
+
# @param [String] value
|
42
43
|
# @return [Array] list of entries
|
43
|
-
# @raise [Soar::Registry::Directory::Error::NetworkingError]
|
44
|
+
# @raise [ArgumentError, Soar::Registry::Directory::Error::NetworkingError]
|
44
45
|
##
|
45
46
|
def search(key, value)
|
46
47
|
@provider.search(key, value)
|
47
48
|
end
|
48
49
|
|
49
50
|
##
|
50
|
-
# @return [Array] a list of
|
51
|
+
# @return [Array] a list of provider specific indexes
|
51
52
|
# @raise [Soar::Registry::Directory::Error::NetworkingError]
|
52
53
|
##
|
53
54
|
def index
|
@@ -12,54 +12,67 @@ module Soar
|
|
12
12
|
attr_accessor :client
|
13
13
|
|
14
14
|
##
|
15
|
-
# @param
|
16
|
-
# @
|
17
|
-
# @
|
18
|
-
# @param
|
15
|
+
# @param [Hash] credentials
|
16
|
+
# @option credentials [String] :username
|
17
|
+
# @option credentials [String] :password
|
18
|
+
# @param [String] table table name
|
19
|
+
# @param [Hash] index
|
20
|
+
# @option index [String] :partition_key
|
21
|
+
# @option index [String] :sort_key
|
22
|
+
# @option index [Array] :global_secondary_indexes
|
23
|
+
# @param configuration [Hash]
|
24
|
+
# @option configuration [String] :region
|
25
|
+
# @option configuration [String] :endpoint
|
19
26
|
##
|
20
27
|
def initialize(credentials: , table: , index: , configuration: )
|
21
28
|
@table_name = table
|
22
|
-
@
|
23
|
-
@
|
29
|
+
@partition_key = index['partition_key']
|
30
|
+
@sort_key = index['sort_key'] if index.key?('sort_key')
|
31
|
+
@global_secondary_indexes = index['global_secondary_index'] if index.key?('global_secondary_index')
|
24
32
|
@credentials = Hashie.symbolize_keys(credentials)
|
25
33
|
configuration[:credentials] = Aws::Credentials.new(@credentials[:username], @credentials[:password])
|
26
34
|
@client = Aws::DynamoDB::Client.new(Hashie.symbolize_keys(configuration))
|
27
35
|
end
|
28
36
|
|
29
37
|
##
|
38
|
+
# @param [Hash] entry
|
39
|
+
# @return [Boolean]
|
40
|
+
# @raise [Soar::Registry::Directory::Error::DuplicateEntryError]
|
30
41
|
##
|
31
|
-
def put(
|
42
|
+
def put(entry)
|
32
43
|
adapt_exceptions do
|
33
44
|
@client.put_item({
|
34
45
|
table_name: @table_name,
|
35
|
-
item:
|
46
|
+
item: entry,
|
47
|
+
condition_expression: "attribute_not_exists(#{@partition_key})"
|
36
48
|
})
|
49
|
+
return true
|
37
50
|
end
|
38
51
|
end
|
39
52
|
|
40
53
|
##
|
41
|
-
# @param [
|
42
|
-
# @
|
43
|
-
# @
|
54
|
+
# @param [Hash] primary_key
|
55
|
+
# @option primary_key [String] :partition_key required
|
56
|
+
# @option primary_key [String] :sort_key required only when defined in schema
|
57
|
+
# @return [Hash] a single matching entry
|
58
|
+
# @raise [Soar::Registry::Directory::Error::NoEntriesFoundError] if primary key not found
|
44
59
|
##
|
45
60
|
def fetch(primary_key)
|
46
61
|
adapt_exceptions do
|
47
62
|
options = {
|
48
63
|
table_name: @table_name,
|
49
|
-
key:
|
50
|
-
"#{@primary_key}": primary_key
|
51
|
-
}
|
64
|
+
key: primary_key
|
52
65
|
}
|
53
66
|
identity = @client.get_item(options)
|
54
|
-
raise Soar::Registry::Directory::Error::
|
67
|
+
raise Soar::Registry::Directory::Error::NoEntriesFoundError, "No entries found for #{@primary_key} = #{primary_key}" if identity.item.nil?
|
55
68
|
identity.item
|
56
69
|
end
|
57
70
|
end
|
58
71
|
|
59
72
|
##
|
60
|
-
# @param [String]
|
61
|
-
# @param [String]
|
62
|
-
# @return [Array] list of
|
73
|
+
# @param [String] key
|
74
|
+
# @param [String] value
|
75
|
+
# @return [Array] list of matching entries
|
63
76
|
# @raise [ArgumentError] if query or index is not specified
|
64
77
|
##
|
65
78
|
def search(key, value)
|
@@ -74,7 +87,7 @@ module Soar
|
|
74
87
|
}
|
75
88
|
}
|
76
89
|
|
77
|
-
options.merge!({index_name: "#{key}-index"}) if @
|
90
|
+
options.merge!({index_name: "#{key}-index"}) if @global_secondary_indexes.include?(key)
|
78
91
|
identity = @client.query(options)
|
79
92
|
identity.items.map { |item|
|
80
93
|
Hashie.stringify_keys(item)
|
@@ -93,20 +106,23 @@ module Soar
|
|
93
106
|
indexed_attributes = []
|
94
107
|
resp['table']['key_schema'].each { |key_schema|
|
95
108
|
indexed_attributes << key_schema['attribute_name']
|
96
|
-
}
|
109
|
+
} if resp['table'].key?('key_schema')
|
110
|
+
|
97
111
|
resp['table']['global_secondary_indexes'].each { |index|
|
98
112
|
index['key_schema'].each { |key_schema|
|
99
113
|
indexed_attributes << key_schema['attribute_name']
|
100
114
|
}
|
101
|
-
}
|
115
|
+
} if resp['table'].key?('global_secondary_indexes')
|
116
|
+
|
102
117
|
indexed_attributes
|
103
118
|
end
|
104
119
|
end
|
105
120
|
|
106
121
|
##
|
107
122
|
# Deletes existing table and creates a new one in its place
|
108
|
-
# @param
|
109
|
-
# @param
|
123
|
+
# @param [String] name the table name
|
124
|
+
# @param [Hash] structure table structure
|
125
|
+
# @return [Boolean]
|
110
126
|
##
|
111
127
|
def recreate_table(name: nil, structure: nil)
|
112
128
|
|
@@ -117,6 +133,7 @@ module Soar
|
|
117
133
|
})
|
118
134
|
end
|
119
135
|
@client.create_table(Hashie.symbolize_keys(structure))
|
136
|
+
return true
|
120
137
|
end
|
121
138
|
|
122
139
|
end
|
@@ -128,6 +145,8 @@ module Soar
|
|
128
145
|
yield
|
129
146
|
rescue Seahorse::Client::NetworkingError => e
|
130
147
|
raise Soar::Registry::Directory::Error::NetworkingError, e.message
|
148
|
+
rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException => e
|
149
|
+
raise Soar::Registry::Directory::Error::DuplicateEntryError, e.message
|
131
150
|
end
|
132
151
|
end
|
133
152
|
|
@@ -11,10 +11,14 @@ module Soar
|
|
11
11
|
attr_accessor :client
|
12
12
|
|
13
13
|
##
|
14
|
-
# @param
|
15
|
-
# @
|
16
|
-
# @
|
17
|
-
# @param
|
14
|
+
# @param [Hash] config
|
15
|
+
# @option config [String] :host
|
16
|
+
# @option config [Number] :port
|
17
|
+
# @param [String] base ldap tree base eg 'dc=hetzner,dc=co,dc=za'
|
18
|
+
# @param [Array] attributes array of attributes to return for queries
|
19
|
+
# @param [Hash] credentials
|
20
|
+
# @option credentials [String] :username
|
21
|
+
# @option credentials [String] :password
|
18
22
|
##
|
19
23
|
def initialize(config: , base: , attributes: , index: , credentials: )
|
20
24
|
adapt_exceptions do
|
@@ -37,29 +41,43 @@ module Soar
|
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
44
|
+
##
|
45
|
+
# @param [Hash] entry
|
46
|
+
# @return [Boolean]
|
47
|
+
# @raise [Soar::Registry::Directory::Error::DuplicateEntryError]
|
48
|
+
##
|
40
49
|
def put(entry)
|
41
50
|
adapt_exceptions do
|
51
|
+
|
52
|
+
@index.each { |index|
|
53
|
+
if (entry[:attributes].keys.include?(index))
|
54
|
+
result = search(index, entry[:attributes][index])
|
55
|
+
raise Soar::Registry::Directory::Error::DuplicateEntryError if result.length > 0
|
56
|
+
end
|
57
|
+
}
|
58
|
+
|
42
59
|
@client.add({
|
43
60
|
dn: entry[:dn],
|
44
61
|
attributes: entry[:attributes]
|
45
62
|
})
|
63
|
+
return true
|
46
64
|
end
|
47
65
|
end
|
48
66
|
|
49
67
|
##
|
50
|
-
# @param [String]
|
51
|
-
# @return [Hash]
|
52
|
-
# @raise [Soar::Registry::Directory::Error::
|
68
|
+
# @param [String] primary key of the identity ie. the first index
|
69
|
+
# @return [Hash] single matching entry
|
70
|
+
# @raise [Soar::Registry::Directory::Error::NoEntriesFoundError] if primary key not found
|
53
71
|
# @raise [Soar::Registry::Directory::Error::MultipleEntriesFound] if multiple matches found
|
54
72
|
##
|
55
|
-
def fetch(
|
73
|
+
def fetch(primary_key)
|
56
74
|
adapt_exceptions do
|
57
75
|
result = @client.search({
|
58
76
|
attributes: @attributes,
|
59
|
-
filter: Net::LDAP::Filter.eq(@index[0],
|
77
|
+
filter: Net::LDAP::Filter.eq(@index[0], primary_key),
|
60
78
|
return_result: true
|
61
79
|
})
|
62
|
-
raise Soar::Registry::Directory::Error::
|
80
|
+
raise Soar::Registry::Directory::Error::NoEntriesFoundError, "No entries found for #{@index[0]} = #{primary_key}" if result.empty?
|
63
81
|
raise Soar::Registry::Directory::Error::MultipleEntriesFound if result.length > 1
|
64
82
|
response = {}
|
65
83
|
@attributes.each { |attribute|
|
@@ -71,9 +89,9 @@ module Soar
|
|
71
89
|
|
72
90
|
|
73
91
|
##
|
74
|
-
# @param
|
75
|
-
# @param
|
76
|
-
# @return [Array] list of
|
92
|
+
# @param [String] key
|
93
|
+
# @param [String] value
|
94
|
+
# @return [Array] list of matching entries
|
77
95
|
# @raise [ArgumentError] if value or named index is not specified
|
78
96
|
##
|
79
97
|
def search(key, value)
|
@@ -97,7 +115,7 @@ module Soar
|
|
97
115
|
end
|
98
116
|
|
99
117
|
##
|
100
|
-
# @return [Array] a list of
|
118
|
+
# @return [Array] a list of indexes
|
101
119
|
##
|
102
120
|
def index
|
103
121
|
adapt_exceptions do
|
@@ -105,9 +123,14 @@ module Soar
|
|
105
123
|
end
|
106
124
|
end
|
107
125
|
|
126
|
+
##
|
127
|
+
# @param [String] dn
|
128
|
+
# @return [Boolean]
|
129
|
+
##
|
108
130
|
def delete(dn)
|
109
131
|
adapt_exceptions do
|
110
132
|
@client.delete(dn: dn)
|
133
|
+
return true
|
111
134
|
end
|
112
135
|
end
|
113
136
|
|
@@ -10,10 +10,16 @@ module Soar
|
|
10
10
|
attr_accessor :client
|
11
11
|
|
12
12
|
##
|
13
|
-
# @param
|
14
|
-
# @
|
15
|
-
# @
|
16
|
-
# @
|
13
|
+
# @param [Hash] config
|
14
|
+
# @option config [String] :host
|
15
|
+
# @option config [Number] :port
|
16
|
+
# @option config [String] :database name
|
17
|
+
# @option config [String] :table name
|
18
|
+
# @param [Array] attributes array of attributes to return for queries
|
19
|
+
# @param [Array] index array of indexes starting with the primary key
|
20
|
+
# @param [Hash] credentials
|
21
|
+
# @option credentials [String] :username
|
22
|
+
# @option credentials [String] :password
|
17
23
|
##
|
18
24
|
def initialize(config: , attributes: '*', index: , credentials: )
|
19
25
|
adapt_exceptions do
|
@@ -31,40 +37,45 @@ module Soar
|
|
31
37
|
end
|
32
38
|
end
|
33
39
|
|
40
|
+
##
|
41
|
+
# @param [Hash] entry
|
42
|
+
# @return [Boolean]
|
43
|
+
##
|
34
44
|
def put(entry)
|
35
45
|
adapt_exceptions do
|
36
46
|
statement = @client.prepare("INSERT INTO #{@table} (#{entry.keys.join(', ')}) VALUES(#{entry.values.map { |s| "?" }.join(', ')})")
|
37
|
-
|
47
|
+
statement.execute(*entry.values)
|
48
|
+
return true
|
38
49
|
end
|
39
50
|
end
|
40
51
|
|
41
52
|
##
|
42
|
-
# @param [String]
|
43
|
-
# @return [Hash]
|
44
|
-
# @raise [Soar::Registry::Directory::Error::
|
53
|
+
# @param [String] primary key the first index
|
54
|
+
# @return [Hash] single matching entry
|
55
|
+
# @raise [Soar::Registry::Directory::Error::NoEntriesFoundError] if primary key not found
|
45
56
|
# @raise [Soar::Registry::Directory::Error::MultipleEntriesFound] if multiple matches found
|
46
57
|
##
|
47
|
-
def fetch(
|
58
|
+
def fetch(primary_key)
|
48
59
|
adapt_exceptions do
|
49
60
|
statement = @client.prepare("SELECT #{@attributes} FROM #{@table} WHERE #{@index[0]} = ? LIMIT 1")
|
50
|
-
mysql_statement = statement.execute(
|
51
|
-
raise Soar::Registry::Directory::Error::
|
61
|
+
mysql_statement = statement.execute(primary_key)
|
62
|
+
raise Soar::Registry::Directory::Error::NoEntriesFoundError, "No entries found for #{@index[0]} = #{primary_key}" if mysql_statement.num_rows == 0
|
52
63
|
mysql_result = mysql_statement.result_metadata
|
53
64
|
fields = mysql_result.fetch_fields
|
54
65
|
field_names = fields.map { |field|
|
55
66
|
field.name
|
56
67
|
}
|
57
68
|
result = mysql_statement.fetch
|
58
|
-
Hash[result.map.with_index { |value, index|
|
69
|
+
result = Hash[result.map.with_index { |value, index|
|
59
70
|
[field_names[index.to_i], value]
|
60
71
|
}].symbolize_keys
|
61
72
|
end
|
62
73
|
end
|
63
74
|
|
64
75
|
##
|
65
|
-
# @param key
|
66
|
-
# @param
|
67
|
-
# @return [Array] list of
|
76
|
+
# @param [String] key should be in indexed in db schema
|
77
|
+
# @param [String] value
|
78
|
+
# @return [Array] list of matching entries
|
68
79
|
# @raise [ArgumentError] if value or named index is not specified
|
69
80
|
##
|
70
81
|
def search(key, value)
|
@@ -87,7 +98,7 @@ module Soar
|
|
87
98
|
end
|
88
99
|
|
89
100
|
##
|
90
|
-
# @return [Array] a list of
|
101
|
+
# @return [Array] a list of indexes the first being the primary key
|
91
102
|
##
|
92
103
|
def index
|
93
104
|
adapt_exceptions do
|
@@ -10,9 +10,8 @@ module Soar
|
|
10
10
|
class Stub
|
11
11
|
|
12
12
|
##
|
13
|
-
# @param
|
14
|
-
# @param
|
15
|
-
# @param index [Array] primary key should be the first item
|
13
|
+
# @param [String] table the table name
|
14
|
+
# @param [Array] indexes primary key should be the first item
|
16
15
|
##
|
17
16
|
def initialize(table: , index: )
|
18
17
|
@interface = Mince::HashyDb::Interface
|
@@ -23,31 +22,37 @@ module Soar
|
|
23
22
|
end
|
24
23
|
|
25
24
|
##
|
26
|
-
# @param
|
25
|
+
# @param [Hash] entry
|
26
|
+
# @raise [Soar::Registry::Directory::Error::DuplicateEntryError]
|
27
|
+
# @return [Boolean]
|
27
28
|
##
|
28
|
-
def put(
|
29
|
+
def put(entry)
|
29
30
|
adapt_exceptions do
|
30
|
-
@interface.
|
31
|
+
if not @interface.get_for_key_with_value(@table, @primary_key, entry[@primary_key])
|
32
|
+
@interface.add(@table, entry)
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
raise Soar::Registry::Directory::Error::DuplicateEntryError, "Unable to add duplicate entry for index #{@primary_key} with value #{entry[@primary_key]}"
|
31
36
|
end
|
32
37
|
end
|
33
38
|
|
34
39
|
##
|
35
|
-
# @param
|
36
|
-
# @return
|
37
|
-
# @raise [Soar::Registry:::Directory::Error::
|
40
|
+
# @param [String] primary_key
|
41
|
+
# @return [Hash] entry
|
42
|
+
# @raise [Soar::Registry:::Directory::Error::NoEntriesFoundError] if primary key not found
|
38
43
|
##
|
39
44
|
def fetch(primary_key)
|
40
45
|
adapt_exceptions do
|
41
46
|
entry = @interface.get_for_key_with_value(@table, @primary_key, primary_key)
|
42
|
-
raise Soar::Registry::Directory::Error::
|
47
|
+
raise Soar::Registry::Directory::Error::NoEntriesFoundError, "No entries found for #{@primary_key} = #{primary_key}" if entry.nil?
|
43
48
|
entry
|
44
49
|
end
|
45
50
|
end
|
46
51
|
|
47
52
|
##
|
48
|
-
# @param [String]
|
49
|
-
# @param [String]
|
50
|
-
# @return [Array] list of
|
53
|
+
# @param [String] key
|
54
|
+
# @param [String] value
|
55
|
+
# @return [Array] list of matching entries
|
51
56
|
# @raise [ArgumentError] if query or index is not specified
|
52
57
|
##
|
53
58
|
def search(key, value)
|
@@ -65,7 +70,7 @@ module Soar
|
|
65
70
|
end
|
66
71
|
|
67
72
|
##
|
68
|
-
# @return [Array] a list of
|
73
|
+
# @return [Array] a list of provider specific indexes
|
69
74
|
##
|
70
75
|
def index
|
71
76
|
adapt_exceptions do
|
@@ -1,56 +1,62 @@
|
|
1
1
|
[
|
2
2
|
{
|
3
|
-
"
|
4
|
-
"
|
5
|
-
"
|
6
|
-
"
|
7
|
-
|
8
|
-
|
9
|
-
"configuration_publisher": {
|
10
|
-
"configuration_identifiers": ["*"]
|
11
|
-
}
|
12
|
-
}
|
3
|
+
"partition_key": "62936e70-1815-439b-bf89-8492855a7e6b",
|
4
|
+
"sort_key": "staff",
|
5
|
+
"attributes" : {
|
6
|
+
"department": "technical"
|
7
|
+
},
|
8
|
+
"global_secondary_index1": "2160f6c31bb4c94e41bfcea8d04bba20"
|
13
9
|
},
|
14
10
|
{
|
15
|
-
"
|
16
|
-
"
|
17
|
-
"
|
18
|
-
"
|
19
|
-
|
20
|
-
|
21
|
-
}
|
22
|
-
|
23
|
-
}
|
11
|
+
"partition_key": "62936e70-1815-439b-bf89-8492855a7e6b",
|
12
|
+
"sort_key": "configuration_publisher",
|
13
|
+
"attributes" : {
|
14
|
+
"configuration_identifiers": ["*"]
|
15
|
+
},
|
16
|
+
"global_secondary_index1": "d3db8f555418a0351d6c9b1e14f16c92"
|
24
17
|
},
|
25
18
|
{
|
26
|
-
"
|
27
|
-
"
|
28
|
-
"
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
19
|
+
"partition_key": "43353f18-8afe-11e6-ae22-56b6b6499611",
|
20
|
+
"sort_key": "staff",
|
21
|
+
"global_secondary_index1": "c640072316e084efd14cfb811a3680e9"
|
22
|
+
},
|
23
|
+
{
|
24
|
+
"partition_key": "43353f18-8afe-11e6-ae22-56b6b6499611",
|
25
|
+
"sort_key": "configuration_consumer",
|
26
|
+
"attributes": {
|
27
|
+
"configuration_identifiers": ["*"]
|
28
|
+
},
|
29
|
+
"global_secondary_index1": "bf9b32d1d059c04f9ab4b2f0fda6dd05"
|
36
30
|
|
31
|
+
},
|
32
|
+
{
|
33
|
+
"partition_key": "820d5660-2204-4f7d-8c04-746313439b81",
|
34
|
+
"sort_key": "staff",
|
35
|
+
"global_secondary_index1": "d8450263f997a0b9e2131111ea20d659"
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"partition_key": "820d5660-2204-4f7d-8c04-746313439b81",
|
39
|
+
"sort_key": "configuration_publisher",
|
40
|
+
"attributes": {
|
41
|
+
"configuration_identifiers": ["*"]
|
37
42
|
},
|
38
|
-
"
|
39
|
-
"detail": "Belvedere Office Park, Unit F",
|
40
|
-
"street": "Bella Rosa Street",
|
41
|
-
"suburb": "Tygervalley",
|
42
|
-
"city": "Durbanville",
|
43
|
-
"postal": "7550"
|
44
|
-
}
|
43
|
+
"global_secondary_index1": "20b0db680941f5178bbfd3458c1ca909"
|
45
44
|
},
|
46
45
|
{
|
47
|
-
"
|
48
|
-
"
|
49
|
-
"
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
46
|
+
"partition_key": "820d5660-2204-4f7d-8c04-746313439b81",
|
47
|
+
"sort_key": "configuration_consumer",
|
48
|
+
"attributes": {
|
49
|
+
"configuration_identifiers": ["*"]
|
50
|
+
},
|
51
|
+
"global_secondary_index1": "3873523c6ff4c4803199aa757c271ed1"
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"partition_key": "1ff472a6-8df3-4f13-82c3-89fde26db3cf",
|
55
|
+
"sort_key": "customer_profile",
|
56
|
+
"attributes": {
|
57
|
+
"owner": ["C123456789"]
|
58
|
+
},
|
59
|
+
"global_secondary_index1": "e72006881d15fc8747a85d05fa16b5cb"
|
54
60
|
}
|
55
61
|
]
|
56
62
|
|
@@ -1,33 +1,40 @@
|
|
1
1
|
{
|
2
|
-
"table_name": "
|
2
|
+
"table_name": "identity_roles",
|
3
3
|
"key_schema": [
|
4
4
|
{
|
5
|
-
"attribute_name": "
|
5
|
+
"attribute_name": "partition_key",
|
6
6
|
"key_type": "HASH"
|
7
|
+
},
|
8
|
+
{
|
9
|
+
"attribute_name": "sort_key",
|
10
|
+
"key_type": "RANGE"
|
7
11
|
}
|
8
12
|
],
|
9
13
|
"attribute_definitions": [
|
10
14
|
{
|
11
|
-
"attribute_name": "
|
15
|
+
"attribute_name": "partition_key",
|
16
|
+
"attribute_type": "S"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"attribute_name": "sort_key",
|
12
20
|
"attribute_type": "S"
|
13
21
|
},
|
14
22
|
{
|
15
|
-
"attribute_name": "
|
23
|
+
"attribute_name": "global_secondary_index1",
|
16
24
|
"attribute_type": "S"
|
17
25
|
}
|
18
26
|
],
|
19
27
|
"global_secondary_indexes": [
|
20
28
|
{
|
21
|
-
"index_name": "
|
29
|
+
"index_name": "global_secondary_index1-index",
|
22
30
|
"key_schema": [
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
31
|
+
{
|
32
|
+
"attribute_name": "global_secondary_index1",
|
33
|
+
"key_type": "HASH"
|
34
|
+
}
|
27
35
|
],
|
28
36
|
"projection": {
|
29
37
|
"projection_type": "ALL"
|
30
|
-
|
31
38
|
},
|
32
39
|
"provisioned_throughput": {
|
33
40
|
"read_capacity_units": 10,
|
@@ -30,6 +30,10 @@ module Soar
|
|
30
30
|
@provider.put_entry
|
31
31
|
end
|
32
32
|
|
33
|
+
def put_duplicate_entry
|
34
|
+
@provider.put_duplicate_entry
|
35
|
+
end
|
36
|
+
|
33
37
|
def search_for_entry
|
34
38
|
@provider.search_for_entry
|
35
39
|
end
|
@@ -42,6 +46,10 @@ module Soar
|
|
42
46
|
@provider.request_index
|
43
47
|
end
|
44
48
|
|
49
|
+
def duplicate_entry?
|
50
|
+
@provider.duplicate_entry?
|
51
|
+
end
|
52
|
+
|
45
53
|
def persisted?
|
46
54
|
@provider.persisted?
|
47
55
|
end
|
@@ -44,19 +44,25 @@ module Soar
|
|
44
44
|
@directory.provider.client = Aws::DynamoDB::Client.new(Hashie.symbolize_keys(@configuration['provider']['config']))
|
45
45
|
end
|
46
46
|
|
47
|
+
def put_duplicate_entry
|
48
|
+
put_entry
|
49
|
+
end
|
50
|
+
|
47
51
|
def put_entry
|
48
52
|
begin
|
49
53
|
@directory.put(@entries[0])
|
50
54
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
51
|
-
@error = e
|
55
|
+
@error = e
|
56
|
+
rescue Soar::Registry::Directory::Error::DuplicateEntryError => e
|
57
|
+
@error = e
|
52
58
|
end
|
53
59
|
end
|
54
60
|
|
55
61
|
def search_for_entry
|
56
62
|
begin
|
57
|
-
@result = @directory.search("
|
63
|
+
@result = @directory.search("global_secondary_index1", @entries[0]['global_secondary_index1'])
|
58
64
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
59
|
-
@error = e
|
65
|
+
@error = e
|
60
66
|
end
|
61
67
|
end
|
62
68
|
|
@@ -64,20 +70,30 @@ module Soar
|
|
64
70
|
begin
|
65
71
|
@result = @directory.index
|
66
72
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
67
|
-
@error = e
|
73
|
+
@error = e
|
68
74
|
end
|
69
75
|
end
|
70
76
|
|
71
77
|
def fetch_entry
|
72
78
|
begin
|
73
|
-
@result = @directory.fetch(
|
74
|
-
|
75
|
-
|
79
|
+
@result = @directory.fetch({
|
80
|
+
@index.keys[0] => @entries[0]['partition_key'],
|
81
|
+
@index.keys[1] => @entries[0]['sort_key']
|
82
|
+
})
|
83
|
+
rescue Soar::Registry::Directory::Error::NoEntriesFoundError, Soar::Registry::Directory::Error::NetworkingError => e
|
84
|
+
@error = e
|
76
85
|
end
|
77
86
|
end
|
78
87
|
|
88
|
+
def duplicate_entry?
|
89
|
+
@error.is_a?(Soar::Registry::Directory::Error::DuplicateEntryError)
|
90
|
+
end
|
91
|
+
|
79
92
|
def persisted?
|
80
|
-
@entries[0] == @directory.fetch(
|
93
|
+
@entries[0] == @directory.fetch({
|
94
|
+
@index.keys[0] => @entries[0]['partition_key'],
|
95
|
+
@index.keys[1] => @entries[0]['sort_key']
|
96
|
+
})
|
81
97
|
end
|
82
98
|
|
83
99
|
def returned?
|
@@ -85,7 +101,11 @@ module Soar
|
|
85
101
|
end
|
86
102
|
|
87
103
|
def index?
|
88
|
-
@index
|
104
|
+
@index == {
|
105
|
+
'partition_key' => @index['partition_key'],
|
106
|
+
'sort_key' => @index['sort_key'],
|
107
|
+
'global_secondary_index' => @index['global_secondary_index']
|
108
|
+
}
|
89
109
|
end
|
90
110
|
|
91
111
|
def single_entry?
|
@@ -93,11 +113,11 @@ module Soar
|
|
93
113
|
end
|
94
114
|
|
95
115
|
def no_entries_found?
|
96
|
-
|
116
|
+
@error.is_a?(Soar::Registry::Directory::Error::NoEntriesFoundError)
|
97
117
|
end
|
98
118
|
|
99
119
|
def networking_error?
|
100
|
-
|
120
|
+
@error.is_a?(Soar::Registry::Directory::Error::NetworkingError)
|
101
121
|
end
|
102
122
|
|
103
123
|
def no_matching_entries?
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'soar/registry/directory'
|
2
2
|
require 'hashie'
|
3
|
+
require 'securerandom'
|
3
4
|
|
4
5
|
module Soar
|
5
6
|
module Registry
|
@@ -65,13 +66,21 @@ module Soar
|
|
65
66
|
|
66
67
|
end
|
67
68
|
|
69
|
+
def put_duplicate_entry
|
70
|
+
begin
|
71
|
+
@directory.put(@entries[0])
|
72
|
+
rescue Soar::Registry::Directory::Error::DuplicateEntryError => e
|
73
|
+
@error = e
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
68
77
|
def put_entry
|
69
78
|
begin
|
70
79
|
@directory.put(@entries[0])
|
71
80
|
result = @directory.search("mail", @entries[0][:attributes][:mail])
|
72
81
|
@entries[0][:attributes][:entryuuid] = result[0][@index[0]]
|
73
82
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
74
|
-
@error = e
|
83
|
+
@error = e
|
75
84
|
end
|
76
85
|
end
|
77
86
|
|
@@ -79,7 +88,7 @@ module Soar
|
|
79
88
|
begin
|
80
89
|
@result = @directory.search("mail", @entries[0][:attributes][:mail])
|
81
90
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
82
|
-
@error = e
|
91
|
+
@error = e
|
83
92
|
end
|
84
93
|
end
|
85
94
|
|
@@ -87,18 +96,22 @@ module Soar
|
|
87
96
|
begin
|
88
97
|
@result = @directory.index
|
89
98
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
90
|
-
@error = e
|
99
|
+
@error = e
|
91
100
|
end
|
92
101
|
end
|
93
102
|
|
94
103
|
def fetch_entry
|
95
104
|
begin
|
96
105
|
@result = @directory.fetch(@entries[0][:attributes][:entryuuid])
|
97
|
-
rescue Soar::Registry::Directory::Error::
|
98
|
-
@error = e
|
106
|
+
rescue Soar::Registry::Directory::Error::NoEntriesFoundError, Soar::Registry::Directory::Error::NetworkingError => e
|
107
|
+
@error = e
|
99
108
|
end
|
100
109
|
end
|
101
110
|
|
111
|
+
def duplicate_entry?
|
112
|
+
@error.is_a?(Soar::Registry::Directory::Error::DuplicateEntryError)
|
113
|
+
end
|
114
|
+
|
102
115
|
def persisted?
|
103
116
|
result = @directory.fetch(@entries[0][:attributes][:entryuuid])
|
104
117
|
entry = @entries[0][:attributes]
|
@@ -113,7 +126,7 @@ module Soar
|
|
113
126
|
end
|
114
127
|
|
115
128
|
def index?
|
116
|
-
@index
|
129
|
+
@index.is_a?(Array)
|
117
130
|
end
|
118
131
|
|
119
132
|
def single_entry?
|
@@ -123,7 +136,7 @@ module Soar
|
|
123
136
|
end
|
124
137
|
|
125
138
|
def no_entries_found?
|
126
|
-
|
139
|
+
@error.is_a?(Soar::Registry::Directory::Error::NoEntriesFoundError)
|
127
140
|
end
|
128
141
|
|
129
142
|
def no_matching_entries?
|
@@ -131,7 +144,7 @@ module Soar
|
|
131
144
|
end
|
132
145
|
|
133
146
|
def networking_error?
|
134
|
-
|
147
|
+
@error.is_a?(Soar::Registry::Directory::Error::NetworkingError)
|
135
148
|
end
|
136
149
|
|
137
150
|
end
|
@@ -16,9 +16,11 @@ module Soar
|
|
16
16
|
@index = @configuration['provider']['config']['index']
|
17
17
|
@attributes = @configuration['provider']['config']['attributes']
|
18
18
|
@entries = [{
|
19
|
+
ID: 1,
|
19
20
|
Client_Number: "C123456789",
|
20
21
|
Notifyemail_Invoice: "johnconner@example.com"
|
21
22
|
}, {
|
23
|
+
ID: 2,
|
22
24
|
Client_Number: "C101112134",
|
23
25
|
Notifyemail_Invoice: "sarahconnor@example.com"
|
24
26
|
}]
|
@@ -50,9 +52,13 @@ module Soar
|
|
50
52
|
@directory.provider.client.close
|
51
53
|
end
|
52
54
|
|
55
|
+
def put_duplicate_entry
|
56
|
+
put_entry
|
57
|
+
end
|
58
|
+
|
53
59
|
def put_entry
|
54
60
|
begin
|
55
|
-
@directory.put(@entries[0])
|
61
|
+
result = @directory.put(@entries[0])
|
56
62
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
57
63
|
@error = e.message
|
58
64
|
end
|
@@ -76,14 +82,14 @@ module Soar
|
|
76
82
|
|
77
83
|
def fetch_entry
|
78
84
|
begin
|
79
|
-
@result = @directory.fetch(@entries[0][:
|
80
|
-
rescue Soar::Registry::Directory::Error::
|
85
|
+
@result = @directory.fetch(@entries[0][:ID])
|
86
|
+
rescue Soar::Registry::Directory::Error::NoEntriesFoundError, Soar::Registry::Directory::Error::NetworkingError => e
|
81
87
|
@error = e.message
|
82
88
|
end
|
83
89
|
end
|
84
90
|
|
85
91
|
def persisted?
|
86
|
-
@directory.fetch(@entries[0][:
|
92
|
+
@directory.fetch(@entries[0][:ID]) == @entries[0]
|
87
93
|
end
|
88
94
|
|
89
95
|
def returned?
|
@@ -91,11 +97,15 @@ module Soar
|
|
91
97
|
end
|
92
98
|
|
93
99
|
def index?
|
94
|
-
@result
|
100
|
+
@result == @index
|
101
|
+
end
|
102
|
+
|
103
|
+
def duplicate_entry?
|
104
|
+
!!(@error =~ /\ADuplicate entry .+\z/)
|
95
105
|
end
|
96
106
|
|
97
107
|
def single_entry?
|
98
|
-
@result == @entries[0]
|
108
|
+
@result == @entries[0]
|
99
109
|
end
|
100
110
|
|
101
111
|
def no_entries_found?
|
@@ -107,7 +117,7 @@ module Soar
|
|
107
117
|
end
|
108
118
|
|
109
119
|
def networking_error?
|
110
|
-
|
120
|
+
patterns = [
|
111
121
|
/\Aquery: not connected.*\z/,
|
112
122
|
/\AMySQL server has gone away\z/,
|
113
123
|
/\ACan't connect to local MySQL server through socket.*\z/,
|
@@ -32,11 +32,17 @@ module Soar
|
|
32
32
|
@directory.provider.instance_variable_set(:@interface, Object.new)
|
33
33
|
end
|
34
34
|
|
35
|
+
def put_duplicate_entry
|
36
|
+
put_entry
|
37
|
+
end
|
38
|
+
|
35
39
|
def put_entry
|
36
40
|
begin
|
37
41
|
@directory.put(@@entry)
|
38
42
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
39
|
-
@error = e
|
43
|
+
@error = e
|
44
|
+
rescue Soar::Registry::Directory::Error::DuplicateEntryError => e
|
45
|
+
@error = e
|
40
46
|
end
|
41
47
|
end
|
42
48
|
|
@@ -44,7 +50,7 @@ module Soar
|
|
44
50
|
begin
|
45
51
|
@entry = @directory.search("identifier", @@entry['identifier'])
|
46
52
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
47
|
-
@error = e
|
53
|
+
@error = e
|
48
54
|
end
|
49
55
|
end
|
50
56
|
|
@@ -52,18 +58,22 @@ module Soar
|
|
52
58
|
begin
|
53
59
|
@index = @directory.index
|
54
60
|
rescue Soar::Registry::Directory::Error::NetworkingError => e
|
55
|
-
@error = e
|
61
|
+
@error = e
|
56
62
|
end
|
57
63
|
end
|
58
64
|
|
59
65
|
def fetch_entry
|
60
66
|
begin
|
61
67
|
@entry = @directory.fetch(@@entry['uuid'])
|
62
|
-
rescue Soar::Registry::Directory::Error::
|
63
|
-
@error = e
|
68
|
+
rescue Soar::Registry::Directory::Error::NoEntriesFoundError, Soar::Registry::Directory::Error::NetworkingError => e
|
69
|
+
@error = e
|
64
70
|
end
|
65
71
|
end
|
66
72
|
|
73
|
+
def duplicate_entry?
|
74
|
+
@error.is_a?(Soar::Registry::Directory::Error::DuplicateEntryError)
|
75
|
+
end
|
76
|
+
|
67
77
|
def persisted?
|
68
78
|
@@entry == @directory.fetch(@@entry["uuid"])
|
69
79
|
end
|
@@ -73,7 +83,7 @@ module Soar
|
|
73
83
|
end
|
74
84
|
|
75
85
|
def index?
|
76
|
-
@index
|
86
|
+
@index.is_a?(Array)
|
77
87
|
end
|
78
88
|
|
79
89
|
def single_entry?
|
@@ -81,7 +91,7 @@ module Soar
|
|
81
91
|
end
|
82
92
|
|
83
93
|
def no_entries_found?
|
84
|
-
|
94
|
+
@error.is_a?(Soar::Registry::Directory::Error::NoEntriesFoundError)
|
85
95
|
end
|
86
96
|
|
87
97
|
def no_matching_entries?
|
@@ -89,7 +99,7 @@ module Soar
|
|
89
99
|
end
|
90
100
|
|
91
101
|
def networking_error?
|
92
|
-
|
102
|
+
@error.is_a?(Soar::Registry::Directory::Error::NetworkingError)
|
93
103
|
end
|
94
104
|
|
95
105
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soar-registry-directory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charles Mulder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashy_db
|
@@ -128,7 +128,6 @@ files:
|
|
128
128
|
- lib/soar/registry/directory/provider/stub.rb
|
129
129
|
- lib/soar/registry/directory/test/fixtures/data-dump.sql
|
130
130
|
- lib/soar/registry/directory/test/fixtures/entries.json
|
131
|
-
- lib/soar/registry/directory/test/fixtures/entries.ldif
|
132
131
|
- lib/soar/registry/directory/test/fixtures/table_structure.json
|
133
132
|
- lib/soar/registry/directory/test/orchestrator.rb
|
134
133
|
- lib/soar/registry/directory/test/provider/dynamo_db.rb
|
File without changes
|