/* * Teleport * Copyright (C) 2023 Gravitational, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package services import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/utils" ) // MarshalDatabaseServer marshals the DatabaseServer resource to JSON. func MarshalDatabaseServer(databaseServer types.DatabaseServer, opts ...MarshalOption) ([]byte, error) { cfg, err := CollectOptions(opts) if err != nil { return nil, trace.Wrap(err) } switch databaseServer := databaseServer.(type) { case *types.DatabaseServerV3: if err := databaseServer.CheckAndSetDefaults(); err != nil { return nil, trace.Wrap(err) } return utils.FastMarshal(maybeResetProtoResourceID(cfg.PreserveResourceID, databaseServer)) default: return nil, trace.BadParameter("unrecognized database server version %T", databaseServer) } } // UnmarshalDatabaseServer unmarshals the DatabaseServer resource from JSON. func UnmarshalDatabaseServer(data []byte, opts ...MarshalOption) (types.DatabaseServer, error) { if len(data) == 0 { return nil, trace.BadParameter("missing database server data") } cfg, err := CollectOptions(opts) if err != nil { return nil, trace.Wrap(err) } var h types.ResourceHeader if err := utils.FastUnmarshal(data, &h); err != nil { return nil, trace.Wrap(err) } switch h.Version { case types.V3: var s types.DatabaseServerV3 if err := utils.FastUnmarshal(data, &s); err != nil { return nil, trace.BadParameter(err.Error()) } if err := s.CheckAndSetDefaults(); err != nil { return nil, trace.Wrap(err) } if cfg.ID != 0 { s.SetResourceID(cfg.ID) } if cfg.Revision != "" { s.SetRevision(cfg.Revision) } if !cfg.Expires.IsZero() { s.SetExpiry(cfg.Expires) } return &s, nil } return nil, trace.BadParameter("database server resource version %q is not supported", h.Version) }