/*****************************************************************************\
 *  sluid.h - Slurm Lexicographically-sortable Unique ID
 *****************************************************************************
 *  This file is part of Slurm, a resource management program.
 *  For details, see <https://slurm.schedmd.com/>.
 *  Please also read the included file: DISCLAIMER.
 *
 *  Slurm is free software; you can redistribute it and/or modify it under
 *  the terms of the GNU General Public License as published by the Free
 *  Software Foundation; either version 2 of the License, or (at your option)
 *  any later version.
 *
 *  In addition, as a special exception, the copyright holders give permission
 *  to link the code of portions of this program with the OpenSSL library under
 *  certain conditions as described in each individual source file, and
 *  distribute linked combinations including the two. You must obey the GNU
 *  General Public License in all respects for all of the code used other than
 *  OpenSSL. If you modify file(s) with this exception, you may extend this
 *  exception to your version of the file(s), but you are not obligated to do
 *  so. If you do not wish to do so, delete this exception statement from your
 *  version.  If you delete this exception statement from all source files in
 *  the program, then also delete it here.
 *
 *  Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
 *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 *  details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with Slurm; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
\*****************************************************************************/

#ifndef _COMMON_SLUID_H
#define _COMMON_SLUID_H

#include "slurm/slurm.h"

/*
 * A SLUID is a 64-bit job identifier that is unique within a given Slurm realm.
 *
 * They are generated by the slurmctld, based on a system identifier that is
 * guaranteed to be unique by the slurmdbd.
 * They can be turned into UUIDs for interoperability with external services.
 *
 * The canonical printed form is "Crockford's Base32" ("cb32").
 * This allows for a standardized 14-character format that (a) sorts
 * lexicographically, (b) avoids issues with upper-vs-lower case, and (c) is
 * distinct from any other JobId format in use in Slurm due to the leading 's'.
 *
 * NOTES: All diagrams are big-endian.
 *
 * The SLUID is constructed as:
 * [ 12-bit cluster ][ 42-bit unix_ts_ms ][ 10-bit sequence ]
 *
 * The cluster field is established by slurmdbd for each slurmctld.
 * This does limit a slurmdbd installation to 4093 distinct clusters.
 * - 0x000 is reserved to avoid collisions with db_index values.
 * - 0x001 is reserved for slurmdbd.
 * - 0xfff is reserved for future use.
 *
 * The timestamp is milliseconds since the unix epoch. It is stored in the job
 * state file to ensure it is always incrementing. Slurm's implementation will
 * last until Y2106, at which point someone will hopefully address the ensuing
 * overflow into the cluster bits.
 *
 * The sequence value is incremented if multiple SLUIDs are generated within
 * the same millisecond. This is uncommon for individually-submitted jobs, but
 * can be observed when submitting job arrays which pre-reserve their entire
 * range at job submission time.
 *
 * The design for SLUID was inspired by:
 * - https://github.com/flux-framework/rfc/blob/master/spec_19.rst
 * - https://github.com/ulid/spec
 * - https://www.crockford.com/base32.html
 * - https://www.rfc-editor.org/rfc/rfc9562.html
 */

/*
 * Initialize generator.
 */
extern void sluid_init(uint16_t cluster, time_t minimum);

/*
 * Generate a random cluster id.
 */
extern uint16_t generate_cluster_id(void);

/*
 * Generate new SLUID.
 * Will fatal() if sluid_init() has never been called.
 * Will also fatal() if clock_gettime() fails.
 */
extern sluid_t generate_sluid(void);

/*
 * The canonical printed form for a SLUID is a lower-case "s" followed by
 * 13 characters encoding the numerical value in "Crockford's Base32".
 *
 * Returns an xmalloc()'d string.
 */
extern char *sluid2str(const sluid_t sluid);

/*
 * Parse the string representation.
 * Must be "s", followed by 13 digits encoding the SLUID, then NUL.
 * Returns 0 on error.
 */
extern sluid_t str2sluid(const char *string);

/*
 * Any SLUID can be promoted into a (mostly-compliant) UUIDv7 (rfc9562).
 *
 * UUIDv7 is:
 * [ 48-bit unix_ts_ms ][ 4-bit version (0b0111) ][ 12-bit rand_a ]
 * [ 2-bit var (0b10) ][ 62-bit rand_b ]
 *
 * SLUID-in-UUIDv7 is:
 * [ 48-bit unix_ts_ms ][ 4-bit version (0b0111) ][ 12 bit sequence ]
 * [ 2-bit var (0b10) ][ 12-bit cluster ][ 18-bit padding ][ 32-bit step ]
 *
 * The 18-bit padding is generated once per cluster, maintained in the state
 * file and accounting, and kept throughout the cluster lifespan. This
 * permits both slurmctld and slurmdbd to generate and validate these UUIDs.
 *
 * The step field is 0xffffffff for anything except job steps.
 *
 * Returns an xmalloc()'d string.
 */
extern char *sluid2uuid(const sluid_t sluid, const uint64_t padding);
extern char *stepid2uuid(const slurm_step_id_t step, const uint64_t padding);

#endif
