Skip to content

Commit 2ca48d4

Browse files
authored
Merge pull request #239 from RobertSchaffer1/update_redis_vars
Handling passwords through file, and location to new redis locations
2 parents 779e83e + f2e0b18 commit 2ca48d4

File tree

3 files changed

+123
-15
lines changed

3 files changed

+123
-15
lines changed

nslsii/__init__.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import appdirs
99
from IPython import get_ipython
1010

11+
from .utils import open_redis_client
1112
from ._version import get_versions
1213

1314
__version__ = get_versions()["version"]
@@ -145,15 +146,9 @@ def configure_base(
145146
from redis import Redis
146147
from redis_json_dict import RedisJSONDict
147148

148-
md = RedisJSONDict(
149-
Redis(
150-
host=redis_url,
151-
port=redis_port,
152-
ssl=redis_ssl,
153-
password=os.getenv("REDIS_PASSWORD") if redis_ssl else None
154-
),
155-
prefix=redis_prefix
156-
)
149+
redis_client = open_redis_client(redis_ssl=redis_ssl, redis_url=redis_url, redis_prefix=redis_prefix)
150+
prefix = redis_prefix if redis_prefix and not redis_ssl else ""
151+
md = RedisJSONDict(redis_client=redis_client, prefix=prefix)
157152

158153
# if RunEngine already defined grab it
159154
# useful when users make their own custom RunEngine

nslsii/sync_experiment/sync_experiment.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
nslsii_api_client = httpx.Client(base_url="https://api.nsls2.bnl.gov")
1919

20+
from nslsii.utils import open_redis_client
21+
2022

2123
def get_current_cycle() -> str:
2224
cycle_response = nslsii_api_client.get(
@@ -154,6 +156,7 @@ def switch_redis_proposal(
154156
beamline: str,
155157
username: Optional[str] = None,
156158
prefix: str = "",
159+
redis_ssl: bool = False,
157160
) -> RedisJSONDict:
158161
"""Update information in RedisJSONDict for a specific beamline
159162
@@ -167,16 +170,18 @@ def switch_redis_proposal(
167170
login name of the user assigned to the proposal; if None, current user will be kept
168171
prefix : str
169172
optional prefix to identify a specific endstation, e.g. `opls`
173+
redis_ssl : bool
174+
optional flag to enable/disable ssl connections to redis
170175
171176
Returns
172177
-------
173178
md : RedisJSONDict
174179
The updated redis dictionary.
175180
"""
176-
177-
redis_client = redis.Redis(host=f"info.{beamline.lower()}.nsls2.bnl.gov")
178-
redis_prefix = f"{prefix}-" if prefix else ""
179-
md = RedisJSONDict(redis_client=redis_client, prefix=redis_prefix)
181+
location = prefix if prefix else beamline
182+
redis_client = open_redis_client(redis_ssl=redis_ssl, redis_prefix=location)
183+
prefix = f"{prefix}-" if prefix and not redis_ssl else ""
184+
md = RedisJSONDict(redis_client=redis_client, prefix=prefix)
180185
username = username or md.get("username")
181186

182187
new_data_session = f"pass-{proposal_number}"
@@ -229,7 +234,7 @@ def switch_redis_proposal(
229234
return md
230235

231236

232-
def sync_experiment(proposal_number, beamline, verbose=False, prefix=""):
237+
def sync_experiment(proposal_number, beamline, verbose=False, prefix="", redis_ssl=False):
233238
# Authenticate the user
234239
username = input("Username : ")
235240
authenticate(username)
@@ -241,7 +246,7 @@ def sync_experiment(proposal_number, beamline, verbose=False, prefix=""):
241246
redis_beamline = normalized_beamlines.get(beamline.lower(), beamline)
242247

243248
md = switch_redis_proposal(
244-
proposal_number, beamline=redis_beamline, username=username, prefix=prefix
249+
proposal_number, beamline=redis_beamline, username=username, prefix=prefix, redis_ssl=redis_ssl
245250
)
246251

247252
if verbose:
@@ -269,6 +274,7 @@ def main():
269274
"--endstation",
270275
dest="prefix",
271276
type=str,
277+
default="",
272278
help="Prefix for redis keys (e.g. by endstation)",
273279
required=False,
274280
)
@@ -280,6 +286,13 @@ def main():
280286
help="Which proposal (e.g. 123456)",
281287
required=True,
282288
)
289+
parser.add_argument(
290+
"-s",
291+
"--enable-ssl",
292+
dest="redis_ssl",
293+
action="store_true",
294+
help="Flag to enable ssl connection with redis",
295+
)
283296
parser.add_argument("-v", "--verbose", action=argparse.BooleanOptionalAction)
284297
args = parser.parse_args()
285298

@@ -288,4 +301,5 @@ def main():
288301
beamline=args.beamline,
289302
verbose=args.verbose,
290303
prefix=args.prefix,
304+
redis_ssl=args.redis_ssl,
291305
)

nslsii/utils.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import os
2+
from redis import Redis
3+
import socket
4+
5+
redis_hosts = [
6+
"xf02id1-six-redis1.nsls2.bnl.gov",
7+
"xf03id1-hxn-redis1.nsls2.bnl.gov",
8+
"xf04bm-maia-redis1.nsls2.bnl.gov",
9+
"xf04bm-xfm-redis1.nsls2.bnl.gov",
10+
"xf04id1-isr-redis1.nsls2.bnl.gov",
11+
"xf05id2-srx-redis1.nsls2.bnl.gov",
12+
"xf06bm-bmm-redis1.nsls2.bnl.gov",
13+
"xf07bm-qas-redis1.nsls2.bnl.gov",
14+
"xf07id1-haxpes-redis1.nsls2.bnl.gov",
15+
"xf07id1-nexafs-redis1.nsls2.bnl.gov",
16+
"xf07id1-rsoxs-redis1.nsls2.bnl.gov",
17+
"xf07id1-ucal-redis1.nsls2.bnl.gov",
18+
"xf08bm-tes-redis1.nsls2.bnl.gov",
19+
"xf08id1-iss-redis1.nsls2.bnl.gov",
20+
"xf09id1-cdi-redis1.nsls2.bnl.gov",
21+
"xf10id1-ixs-redis1.nsls2.bnl.gov",
22+
"xf11id1-chx-redis1.nsls2.bnl.gov",
23+
"xf11bm-cms-redis1.nsls2.bnl.gov",
24+
"xf12id1-opls-redis1.nsls2.bnl.gov",
25+
"xf12id2-smi-redis1.nsls2.bnl.gov",
26+
"xf16id1-lix-redis1.nsls2.bnl.gov",
27+
"xf17bm-xfp-redis1.nsls2.bnl.gov",
28+
"xf17id1-amx-redis1.nsls2.bnl.gov",
29+
"xf17id2-fmx-redis1.nsls2.bnl.gov",
30+
"xf18id1-fxi-redis1.nsls2.bnl.gov",
31+
"xf19id2-nyx-redis1.nsls2.bnl.gov",
32+
"xf21id1-arpes-redis1.nsls2.bnl.gov",
33+
"xf21id1-xpeem-redis1.nsls2.bnl.gov",
34+
"xf23id1-csx-redis1.nsls2.bnl.gov",
35+
"xf23id2-ios-redis1.nsls2.bnl.gov",
36+
"xf27id1-hex-redis1.nsls2.bnl.gov",
37+
"xf28id1-pdf-redis1.nsls2.bnl.gov",
38+
"xf28id2-xpd-redis1.nsls2.bnl.gov",
39+
"xf28id2-xpdd-redis1.nsls2.bnl.gov",
40+
"xf31id1-tst-redis1.nsls2.bnl.gov",
41+
]
42+
43+
44+
def open_redis_client(
45+
redis_url=None,
46+
redis_port=None,
47+
redis_ssl=False,
48+
redis_prefix: str = "",
49+
redis_db: int = 0,
50+
) -> Redis:
51+
"""
52+
Helper function to get the redis client connection.
53+
"""
54+
redis_url = os.getenv("REDIS_HOST", redis_url)
55+
if not redis_url:
56+
if redis_ssl:
57+
client_loc_id = (
58+
redis_prefix if redis_prefix else socket.gethostname().split("-")[0]
59+
)
60+
client_locations = [
61+
location for location in redis_hosts if client_loc_id in location
62+
]
63+
if len(client_locations) != 1:
64+
raise RuntimeError(
65+
"Failed to derive redis server url, please specify using the "
66+
"redis_url argument."
67+
)
68+
else:
69+
redis_url = client_locations[0]
70+
else:
71+
tla = os.getenv("BEAMLINE_ACRONYM").lower()
72+
redis_url = f"info.{tla}.nsls2.bnl.gov"
73+
74+
if redis_ssl:
75+
redis_pw = os.getenv("REDIS_PASSWORD")
76+
if not redis_pw:
77+
redis_secret_file = os.getenv(
78+
"REDIS_SECRET_FILE", "/etc/bluesky/redis.secret"
79+
)
80+
with open(redis_secret_file, "r", encoding="utf-8") as password_file:
81+
redis_pw = password_file.read().strip()
82+
else:
83+
redis_pw = None
84+
85+
redis_port = os.getenv("REDIS_PORT", redis_port)
86+
if not redis_port:
87+
if not redis_ssl:
88+
redis_port = 6379
89+
else:
90+
redis_port = 6380
91+
92+
conn = Redis(
93+
host=redis_url,
94+
port=redis_port,
95+
ssl=redis_ssl,
96+
password=redis_pw,
97+
db=redis_db,
98+
)
99+
return conn

0 commit comments

Comments
 (0)