You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.7 KiB
80 lines
2.7 KiB
#
|
|
# Copyright 2021 Splunk Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
"""This module provide utils that are private to solnlib."""
|
|
|
|
import re
|
|
from typing import Any, Dict, Optional, Union
|
|
|
|
from splunklib import binding, client
|
|
|
|
from solnlib import splunk_rest_client
|
|
from solnlib.utils import retry
|
|
|
|
|
|
@retry(exceptions=[binding.HTTPError])
|
|
def get_collection_data(
|
|
collection_name: str,
|
|
session_key: str,
|
|
app: str,
|
|
owner: Optional[str] = None,
|
|
scheme: Optional[str] = None,
|
|
host: Optional[str] = None,
|
|
port: Optional[Union[str, int]] = None,
|
|
fields: Optional[Dict] = None,
|
|
**context: Any,
|
|
) -> client.KVStoreCollectionData:
|
|
"""Get collection data, if there is no such collection - creates one.
|
|
|
|
Arguments:
|
|
collection_name: Collection name of KV Store checkpointer.
|
|
session_key: Splunk access token.
|
|
app: App name of namespace.
|
|
owner: Owner of namespace, default is `nobody`.
|
|
scheme: The access scheme, default is None.
|
|
host: The host name, default is None.
|
|
port: The port number, default is None.
|
|
fields: Fields used to initialize the collection if it's missing.
|
|
context: Other configurations for Splunk rest client.
|
|
|
|
Raises:
|
|
binding.HTTPError: HTTP error different from 404, for example 503 when
|
|
KV Store is initializing and not ready to serve requests.
|
|
KeyError: KV Store did not get collection_name.
|
|
|
|
Returns:
|
|
KV Store collections data instance.
|
|
"""
|
|
kvstore = splunk_rest_client.SplunkRestClient(
|
|
session_key, app, owner=owner, scheme=scheme, host=host, port=port, **context
|
|
).kvstore
|
|
|
|
collection_name = re.sub(r"[^\w]+", "_", collection_name)
|
|
try:
|
|
kvstore.get(name=collection_name)
|
|
except binding.HTTPError as e:
|
|
if e.status != 404:
|
|
raise
|
|
|
|
fields = fields if fields is not None else {}
|
|
kvstore.create(collection_name, fields=fields)
|
|
|
|
collections = kvstore.list(search=collection_name)
|
|
for collection in collections:
|
|
if collection.name == collection_name:
|
|
return collection.data
|
|
else:
|
|
raise KeyError(f"Get collection data: {collection_name} failed.")
|