Skip to content

DRAFT: CV2 db schema support #2452

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 31 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
2af1050
WIP: refactoring for CV2 db integration
glimberg Apr 3, 2025
5c73fe9
build fix
glimberg Apr 3, 2025
0b04f77
make things compile
glimberg Apr 3, 2025
1d21306
use the CV2 db instance if the path prefix is cv2://
glimberg Apr 3, 2025
fb7b07f
make sure the pg connstring is correct for cv2:// instances
glimberg Apr 3, 2025
2c8f032
CV2 controller. Should have everything but SSO now
glimberg Apr 10, 2025
1a6c0a5
reflect schema changes
glimberg May 1, 2025
35d3755
v2controller docker target on mac
glimberg May 1, 2025
48f9f7d
Allow setting cv2: for the db url
glimberg May 1, 2025
332a7d1
more fun with the startup script
glimberg May 1, 2025
db06c98
startup script
glimberg May 1, 2025
af3f8b0
fix cv2 connection
glimberg May 1, 2025
7c88b3f
fix a couple of queries
glimberg May 7, 2025
990ecb5
another query fix
glimberg May 7, 2025
af715ca
query & null fix
glimberg May 8, 2025
182148a
query fix
glimberg May 8, 2025
4a8daf4
more query fixes
glimberg May 8, 2025
4b7c515
"" instead of nullptr
glimberg May 8, 2025
c68aceb
Add db migrations to CV2 db
glimberg May 13, 2025
42f760d
file:// url
glimberg May 13, 2025
c9e08c9
add postgres tag to go install migrate
glimberg May 13, 2025
b42067e
account for SSL db connection
glimberg May 13, 2025
224ee88
cleanup some debug statements
glimberg May 13, 2025
1ffadf3
Get node OS/Arch info into the CV2 db
glimberg May 14, 2025
10ac0c2
remove `last_authorized_credential` field.
glimberg May 19, 2025
d5f6f6b
fix sql statement
glimberg May 19, 2025
568da75
another query fix
glimberg May 19, 2025
af0a911
another query update
glimberg May 19, 2025
08b1ceb
"relayed" as ip addr for unknown IP in last_seen
glimberg May 21, 2025
3cef1b0
error output on exceptions in commit thread
glimberg May 21, 2025
6fa849c
dump member save output only on error
glimberg May 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,851 changes: 1,851 additions & 0 deletions controller/CV1.cpp

Large diffs are not rendered by default.

144 changes: 144 additions & 0 deletions controller/CV1.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
/*
* Copyright (c)2019 ZeroTier, Inc.
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file in the project's root directory.
*
* Change Date: 2026-01-01
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2.0 of the Apache License.
*/
/****/

#include "DB.hpp"

#ifdef ZT_CONTROLLER_USE_LIBPQ

#ifndef ZT_CONTROLLER_CV1_HPP
#define ZT_CONTROLLER_CV1_HPP

#define ZT_CENTRAL_CONTROLLER_COMMIT_THREADS 4

#include "ConnectionPool.hpp"
#include <pqxx/pqxx>

#include <memory>
#include <redis++/redis++.h>

#include "../node/Metrics.hpp"

#include "PostgreSQL.hpp"


namespace smeeclient {
struct SmeeClient;
}

namespace ZeroTier {

struct RedisConfig;

/**
* A controller database driver that talks to PostgreSQL
*
* This is for use with ZeroTier Central. Others are free to build and use it
* but be aware that we might change it at any time.
*/
class CV1 : public DB
{
public:
CV1(const Identity &myId, const char *path, int listenPort, RedisConfig *rc);
virtual ~CV1();

virtual bool waitForReady();
virtual bool isReady();
virtual bool save(nlohmann::json &record,bool notifyListeners);
virtual void eraseNetwork(const uint64_t networkId);
virtual void eraseMember(const uint64_t networkId, const uint64_t memberId);
virtual void nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const InetAddress &physicalAddress);
virtual void nodeIsOnline(const uint64_t networkId,const uint64_t memberId,const InetAddress &physicalAddress, const char *osArch);
virtual AuthInfo getSSOAuthInfo(const nlohmann::json &member, const std::string &redirectURL);

virtual bool ready() {
return _ready == 2;
}

protected:
struct _PairHasher
{
inline std::size_t operator()(const std::pair<uint64_t,uint64_t> &p) const { return (std::size_t)(p.first ^ p.second); }
};
virtual void _memberChanged(nlohmann::json &old,nlohmann::json &memberConfig,bool notifyListeners) {
DB::_memberChanged(old, memberConfig, notifyListeners);
}

virtual void _networkChanged(nlohmann::json &old,nlohmann::json &networkConfig,bool notifyListeners) {
DB::_networkChanged(old, networkConfig, notifyListeners);
}

private:
void initializeNetworks();
void initializeMembers();
void heartbeat();
void membersDbWatcher();
void _membersWatcher_Postgres();
void networksDbWatcher();
void _networksWatcher_Postgres();

void _membersWatcher_Redis();
void _networksWatcher_Redis();

void commitThread();
void onlineNotificationThread();
void onlineNotification_Postgres();
void onlineNotification_Redis();
uint64_t _doRedisUpdate(sw::redis::Transaction &tx, std::string &controllerId,
std::unordered_map< std::pair<uint64_t,uint64_t>,NodeOnlineRecord,_PairHasher > &lastOnline);

void configureSmee();
void notifyNewMember(const std::string &networkID, const std::string &memberID);

enum OverrideMode {
ALLOW_PGBOUNCER_OVERRIDE = 0,
NO_OVERRIDE = 1
};

std::shared_ptr<ConnectionPool<PostgresConnection> > _pool;

const Identity _myId;
const Address _myAddress;
std::string _myAddressStr;
std::string _connString;

BlockingQueue< std::pair<nlohmann::json,bool> > _commitQueue;

std::thread _heartbeatThread;
std::thread _membersDbWatcher;
std::thread _networksDbWatcher;
std::thread _commitThread[ZT_CENTRAL_CONTROLLER_COMMIT_THREADS];
std::thread _onlineNotificationThread;

std::unordered_map< std::pair<uint64_t,uint64_t>,NodeOnlineRecord,_PairHasher > _lastOnline;

mutable std::mutex _lastOnline_l;
mutable std::mutex _readyLock;
std::atomic<int> _ready, _connected, _run;
mutable volatile bool _waitNoticePrinted;

int _listenPort;
uint8_t _ssoPsk[48];

RedisConfig *_rc;
std::shared_ptr<sw::redis::Redis> _redis;
std::shared_ptr<sw::redis::RedisCluster> _cluster;
bool _redisMemberStatus;

smeeclient::SmeeClient *_smee;
};

} // namespace ZeroTier

#endif // ZT_CONTROLLER_CV1_HPP

#endif // ZT_CONTROLLER_USE_LIBPQ
Loading
Loading