tools/slav.git
4 years agoMerge branch 'deployment' 13/216413/1 master
Pawel Wieczorek [Thu, 24 Oct 2019 12:40:51 +0000 (14:40 +0200)]
Merge branch 'deployment'

Change-Id: I667ec7beea96aa5b4563342eeacc91cd2c14fd68

4 years agoAdd isolated environment bootstrap script 54/216054/1 deployment
Pawel Wieczorek [Fri, 18 Oct 2019 13:43:21 +0000 (15:43 +0200)]
Add isolated environment bootstrap script

This patch is intended to provide a quick way to try out SLAV.

Change-Id: I7d93dbb8adbb5161ad8cd92eef6d81346848c274
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
4 years agoAllow access to SLAV repository main directory from Vagrant environment 53/216053/1
Pawel Wieczorek [Fri, 18 Oct 2019 13:16:50 +0000 (15:16 +0200)]
Allow access to SLAV repository main directory from Vagrant environment

This patch will allow accessing other SLAV subprojects inside Vagrant
machine (in the isolated environment).

Directory synchronization is currently one-way-only, i.e. any changes
made in Vagrant will not be reflected in local repository.

Change-Id: I523f3fe1b5bffe748603506800b960c4258a7d92
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
4 years agoDivide ansible roles into several task files 52/216052/1
Pawel Wieczorek [Fri, 18 Oct 2019 13:11:53 +0000 (15:11 +0200)]
Divide ansible roles into several task files

This patch intends to clarify necessary tasks for SLAV deployment. It
also allows performing only selected tasks from roles using tags.

Change-Id: Iff8f3d484230775376d6965c796fef433d9872f6
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
4 years agoDeploy Boruta and Weles 40/190540/4
Alexander Mazuruk [Wed, 3 Oct 2018 12:22:24 +0000 (14:22 +0200)]
Deploy Boruta and Weles

This patch provides sample inventory for deployments. It also adds
private network interface to Vagrant machine for server connections.
Current Vagrant setup will accept connections from this local private
network only.

To use provided sample inventory, a symlink should be created:

$ ln -s inventory.yml{.sample,}

In case services should be undeployed, following commands should be run
(as a privileged user) for "boruta" and "weles":

# systemctl stop $SERVICE
# systemctl disable $SERVICE
# rm /etc/systemd/system/$SERVICE
# rm /usr/local/bin/$SERVICE
# systemctl daemon-reload
# systemctl reset-failed

Change-Id: Ic2d038461c55ef7e25ffb273cf197604bba95559
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
4 years agoAdd initial build recipes for Dryad (on ARMv7) and Weles 02/190502/2
Alexander Mazuruk [Tue, 2 Oct 2018 18:35:30 +0000 (20:35 +0200)]
Add initial build recipes for Dryad (on ARMv7) and Weles

This patch provides new ansible roles for Weles and Dryad. Dryad
executables ("dryad" from Boruta and "stm", "fota" from MuxPi) are built
for ARMv7 by default.

Ansible inventory for Vagrant machine has been modified accordingly.
This environment is suggested for the first time users to minimize
initial overhead.

Change-Id: I508dce8bab2947b3dd0f811ce47a13b8e094c551
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
4 years agoAdd initial version of ansible deployment for Boruta 86/189286/3
Krzysztof Opasiak [Fri, 14 Sep 2018 19:15:45 +0000 (21:15 +0200)]
Add initial version of ansible deployment for Boruta

This can deploy Boruta server on a standard Ubuntu 18.04 minimal cloud
image. The expected content of inventory file (read on for simpler
approach):

all_srvs:
  children:
    boruta_srv:
      hosts:
        <IP>:
          gopath: "~/go"

Deployment depends on having "ansible" installed on control node (e.g.
operator's workstation) [1]. External role [2] has to be available, too.

After ensuring tools requirements deployment can be verified by running:

$ vagrant up

within "vagrant/" directory.

[1] https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
[2] https://galaxy.ansible.com/andrewrothstein/go

Change-Id: I32a2c1b44797fec6308ed0a4d217a3e3cfb68b5f
Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
4 years agoAdd Apache 2.0 license
Pawel Wieczorek [Wed, 18 Sep 2019 15:37:05 +0000 (17:37 +0200)]
Add Apache 2.0 license

Change-Id: I805b8bf32b12f7f8740a4a5b9975a72db6ab2e88
Signed-off-by: Pawel Wieczorek <p.wieczorek2@samsung.com>
5 years agoAdd documentation to logger package
Lukasz Wojciechowski [Thu, 22 Nov 2018 16:48:29 +0000 (17:48 +0100)]
Add documentation to logger package

The documentation briefly describes usage of logger and main structures
building the solution.

The patch can be verified by serving documentation with godoc:
$ godoc -http=:6060

and checking the web page:
http://localhost:6060/pkg/github.com/SamsungSLAV/slav/logger

Special thank are due to Alexander Mazuruk for making this patch readable

Change-Id: I8189bbe53a887766d44cfffce0dbd7887ae7fa1d
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
5 years agoFix SerializerText timestamp tests
Lukasz Wojciechowski [Thu, 22 Nov 2018 10:39:46 +0000 (11:39 +0100)]
Fix SerializerText timestamp tests

The time variables used for tests were defined in local timezone.
On different machines the output of timestamp serialization was also
in different timezones.
This was fixed to use UTC timezone for that test.

To cover also serilization in different timezones an additional test
was added to verify serialization in different timezones.

Change-Id: I69e9530006c425426f944d2591c8ae4a5e3713ce
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoMerge pull request #1 from SamsungSLAV/logger
Łukasz Wojciechowski [Wed, 31 Oct 2018 18:10:48 +0000 (19:10 +0100)]
Merge pull request #1 from SamsungSLAV/logger

Merge branch logger to master

5 years agoAdjust logger to github.com/SamsungSLAV/slav
Lukasz Wojciechowski [Tue, 30 Oct 2018 20:25:04 +0000 (21:25 +0100)]
Adjust logger to github.com/SamsungSLAV/slav

Change-Id: I72ea4b76c9ce472ddb9fd9d86f1a654be3285d72
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoMove thisPackage to util_test 85/191985/8 logger
Alexander Mazuruk [Fri, 26 Oct 2018 11:08:21 +0000 (13:08 +0200)]
Move thisPackage to util_test

Change-Id: I8eb2a74f1cc8958d9a7f5c056181b816b4f28dbc
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
5 years agoAdd String value to Level converter 29/191929/13
Alexander Mazuruk [Thu, 25 Oct 2018 13:03:02 +0000 (15:03 +0200)]
Add String value to Level converter

Needed to provide user with ability to modify logging level via cli flag.

Change-Id: I2aded851d38d6db771ad8200412b9ea78140cf5c
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
5 years agoAdd CallContext support 05/189805/9
Lukasz Wojciechowski [Thu, 20 Sep 2018 17:42:12 +0000 (19:42 +0200)]
Add CallContext support

Call to logger functions will collect source code context
of the place from where logging function was called.
The context contains:
* source code file path
* source code file name
* source code file line number
* package name
* function name
* type if function is some type's method
All these information are available in Entry.CallContext field.

In case of embedding logging functions in helpers a IncDepth method
is provided. It allows control of extracting proper stack frame from
call stack, e.g.

1    func helper1(message string) {
2        Error(message)
3    }
4    func helper2(message string) {
5        IncDepth(1).Error(message)
6    }
7    func foo() {
8        helper1("bar")
9        helper2("bar")
10   }

Context of the log from helper1 function will point to line 2.
Context of the log from helper2 function will point to line 9.

The IncDepth function is available for Logger, Entry
and as a global function on default logger.

The SerializerText and SerializerJSON have been also adjusted
to support serialization of context.

In case of SerializerText there are several modes available
for serializing context mode:
* CallContextModeNone - no context is used;
* CallContextModeCompact (default) - file name and line number
      are used;
* CallContextModeFunction - file name, line number and function
      name are used;
* CallContextModeFile - full file path and line number are used;
* CallContextModePackage - package name, line number and function
      are used.

Change-Id: I5a30658e7e905f31e79c2147f048d158a5aa6674
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd writer to syslog 25/186025/12
Lukasz Wojciechowski [Mon, 6 Aug 2018 18:49:44 +0000 (20:49 +0200)]
Add writer to syslog

The WriterSyslog provides an implementation of Writer interface logging
to syslog using standard golang log/syslog package.

It allows connection to both local and remote log servers, using custom tag
and log severity. The paramaters passed to NewWriterSyslog are exactly
the same as to log/syslog.Dial function.
Please see log/syslog documentation for details.

Creation of new WriterSyslog panics, if it cannot connect to the log daemon.

Change-Id: Id37a6d0210b76429fd617696772da0ead29e1a5f
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd default logger and global access functions 48/185448/13
Lukasz Wojciechowski [Mon, 30 Jul 2018 20:05:58 +0000 (22:05 +0200)]
Add default logger and global access functions

This patch provides a global variable containing the default
logger object. The default logger is initialized with:
* threshold set to Info level
* single "default" backend with:
    * Filter : FilterPassAll - accepting all log entries.
    * Serializer : SerializerText - formatting entries as text
        with default values:
        * TimeStampMode : TimeStampModeDiff - relative time stamp
        * UseColors : true - colorization enabled
        * QuoteMode : QuoteModeSpecialAndEmpty - quoting all empty
             or containing special characters strings
    * Writer : WriterStderr - printing to standard error output stream.

The default logger can be replaced any time with custom one by SetDefault
function.

The patch provides also functions for:
* operating on threshold,
* backends management,
* logging and formatted logging,
* creation of structured entries with properties and error.
All of these methods are a simple pass through for Logger methods
called on default logger object.

Change-Id: I7d14a28ce481f3f8743a2ae5f926f34463afa8fa
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoImplement writer to stderr 47/185447/13
Lukasz Wojciechowski [Mon, 30 Jul 2018 18:46:20 +0000 (20:46 +0200)]
Implement writer to stderr

The WriterStderr type implements Writer interface.
It writes received data to the standard error output.

Change-Id: I13f2a3a82f0b99ec06b8bc65bf334e0a99b21b2e
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoMove withStderrMocked to util_test 46/185446/13
Lukasz Wojciechowski [Mon, 30 Jul 2018 18:45:49 +0000 (20:45 +0200)]
Move withStderrMocked to util_test

The withStderrMocked, which allows to capture stderr content,
is required in more than one unit tests file.

So it fits better in separate utils file.

Change-Id: Iedc354fa8a05150bace93297ce2b68f1be324a6e
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoImplement writer to file 45/185445/12
Lukasz Wojciechowski [Mon, 30 Jul 2018 18:21:34 +0000 (20:21 +0200)]
Implement writer to file

The WriterFile type implements Writer interface.
It writes received data to the file, which is open during
creation of the WriterFile object with NewWriterFile function.
Every log message is written to separate line.

If file does not exist, it is created.
If file exists it is opened in append mode.

NewWriteFile function panics, if it cannot open the file.

Change-Id: I553cd042d3a873f2d6c7b1e33861f8c1ae74bc13
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoImplement a dummy always accepting FilterPassAll 42/185442/12
Lukasz Wojciechowski [Mon, 30 Jul 2018 16:03:27 +0000 (18:03 +0200)]
Implement a dummy always accepting FilterPassAll

FilterPassAll implements Filter interface.
It accepts all Entries (Verify method always returns true).

Change-Id: Ia94e19d530b60c5d154640a2c5aee54ca50b2ad9
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoImplement Serializer for Text 40/185440/12
Lukasz Wojciechowski [Mon, 30 Jul 2018 14:51:04 +0000 (16:51 +0200)]
Implement Serializer for Text

SerializerText converts Entry structure into text format stored in raw
byte buffer.

There are several customizations that can be made by changing fields
of the SerializerText structure:

TimestampMode - defines the way timestamp is serialized.
    There are 3 options:

    TimestampModeNone - no timestamp is used;
    TimestampModeDiff (default) - relative time in seconds with microsecond
        precision since creation of SerializerText object;
    TimestampModeFull - absoltue time in customizable format.

TimeFormat - used only in case of TimestampModeFull defines format for
    serializing Entry's timestamp. It can be set to one of the values
    accepted by the time.Format. The default value is time.RFC3339.

UseColors (default true) - defines if logs should be colorized.
    If set to true, then log level and properties keys are serialized
    with predefined colors.

QuoteMode - defines if log message, keys and values of the properties
    should be quoted before serialization. There are 4 available options:

    QuoteModeNone - no quoting is used;
    QuoteModeSpecial - any string containing at least one special character
        is quoted;
    QuoteModeSpecialAndEmpty - any empty string or one that contains
        at least one special character is quoted;
    QuoteModeAll - all strings are quoted.

    Common characters are:
        'a'-'z', 'A'-'Z', '0'-'9', '-', '.', '_', '/', '@', '^', '+'
    All other characters are special.

Change-Id: Ia861c32bf0cf9bc30b1c42e06d9142f38f78899a
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoImplement Serializer for JSON 80/185180/11
Lukasz Wojciechowski [Thu, 26 Jul 2018 15:19:29 +0000 (17:19 +0200)]
Implement Serializer for JSON

SerializerJSON converts Entry structure into JSON format stored in raw
byte buffer.

The structure for the entry consist of 4 top level fields:
  level      - log message importance level as string
  message    - log message passed to logging function
  timestamp  - timestamp in customizable format
  properties - all Entry's properties as map serialized to JSON
               creating lower level of the structure

For timestamp format customization, set SerializerJSON.TimestampFormat
to one of the values accepted by the time.Format.
The default value is time.RFC3339.

If Entry does not contain any properties, the properties field is omitted.

Change-Id: I3a72a0d82b404a819543cc264f89616052bfd340
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoUse atomic operations for threshold protection 79/185179/10
Lukasz Wojciechowski [Wed, 25 Jul 2018 19:33:26 +0000 (21:33 +0200)]
Use atomic operations for threshold protection

atomic.StoreUint32 and atomic.LoadUint32 are used for accessing
threshold level in Logger.
They are much faster than mutexes.

Change-Id: Idd4db0ab2df1e5d783abc13c0b29c7560a1e0734
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd timestamp to log message 70/184970/12
Lukasz Wojciechowski [Tue, 24 Jul 2018 15:20:46 +0000 (17:20 +0200)]
Add timestamp to log message

Timestamp is recorded during log message finalization in
Entry's process method. It is set to time.Now().

Change-Id: If8bf627789e3c6979d4beb34df9f444ca27bdebd
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd key-value properties to log messages 69/184969/12
Lukasz Wojciechowski [Tue, 24 Jul 2018 15:12:56 +0000 (17:12 +0200)]
Add key-value properties to log messages

Properties enhance Entry with key-value pairs, which might help in
automated analysis of produced logs.

3 new methods of Logger allow creation of Entry with a single property
(WithProperty); with whole set of properties (WithProperties); or with
a special error property (WithError).

Created Entry can be enhanced with additional properties with exactly
same methods defined on Entry type. Every such call adds new properties
or replaces existing values in case of key duplication.

After creating an Entry with properties, it should be logged using
any of logging methods.

Change-Id: Ia6620522380097efcdc058fadfeee97780c7676c
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd gometalinter config for CI 98/191998/3
Alexander Mazuruk [Fri, 26 Oct 2018 11:39:04 +0000 (13:39 +0200)]
Add gometalinter config for CI

Change-Id: Ie73a5fa51e0a60cdd806ef7249374158bd643862
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
5 years agoAggregate go generate commands 63/192063/2
Lukasz Wojciechowski [Mon, 29 Oct 2018 12:57:18 +0000 (13:57 +0100)]
Aggregate go generate commands

Change-Id: I81335fca8cb93579ec025ae2cbed1f0c1eff5971
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoFix formatting of the code 62/192062/2
Lukasz Wojciechowski [Mon, 29 Oct 2018 12:54:06 +0000 (13:54 +0100)]
Fix formatting of the code

Lines longer than 100 chars were wrapped.

Change-Id: I6716e125b5c92e52f1ddfd5ec247aab07c9f990c
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd tests for Entry and Logger logging methods 68/184968/8
Lukasz Wojciechowski [Tue, 24 Jul 2018 13:42:15 +0000 (15:42 +0200)]
Add tests for Entry and Logger logging methods

After processing of a log message is completed, testing of all logging
methods becomes available.

Both Entry and Logger methods are tested using backend with mocked up
filter, serializer and writer.

In all tests threshold is set to Debug level, so that all messages
logged during the tests pass threshold and are passed to be processed
by backends.

Change-Id: I10a1365b255fb0caf083f5dee19de889d92e42a5
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoUse backends in Logger 60/184860/10
Lukasz Wojciechowski [Mon, 23 Jul 2018 19:42:31 +0000 (21:42 +0200)]
Use backends in Logger

This patch completes processing of log message.
Entry's process method passes entry to Logger's process method,
which passes it to all logger's backends.

If log message processing by any backends fail with error, information
is printed on stderr.

Change-Id: Ibae02737856d4b5d4d65e1306ec4ba5dc14f007c
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoImplement Backend's logic 49/184749/10
Lukasz Wojciechowski [Fri, 20 Jul 2018 19:59:06 +0000 (21:59 +0200)]
Implement Backend's logic

Logging a message by backend is simple. It consists of 3 steps:
1) filtering using Filter
2) serialization to raw bytes buffer using Serializer
3) exporting log using Writer

If any of these steps return error or log message does not pass filter,
the message is not written.

Change-Id: I8a0d2924ba2887d00871007999885549cffc0348
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd backends management in Logger 48/184748/9
Lukasz Wojciechowski [Fri, 20 Jul 2018 19:30:53 +0000 (21:30 +0200)]
Add backends management in Logger

Logger can log to multiple backends identified with string name.

The list of active backends can be changed in runtime using:
AddBackend, RemoveBackend and RemoveAllBackends methods.

The backends map is protected by mutex to allow concurrent access.

In future, if required because of performance issues,
mutex locking can be:
* dropped - making it users' responsibility to protect logger
            from concurrent backends manipulation;
* replaced with sealing mechanism - after logger is sealed no changes
            in backends are allowed and critical sections are dropped.

Change-Id: I28d76874896bb4f75112927d44a1d87006901f34
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoDefine backend and its interfaces 47/184747/9
Lukasz Wojciechowski [Fri, 20 Jul 2018 18:26:56 +0000 (20:26 +0200)]
Define backend and its interfaces

Backend structure consists of 3 elements:
* Filter - which chooses log entries to be handled by backend;
* Serializer - which formats log message;
* Writer - which prints, saves or sends log message.

All interfaces are mocked up for test purposes.
Proper mockgen commands are added to interface definitions files
using go:generate mechanism.

Change-Id: I05b6a14d56890a423e22f13915cac8070167847e
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd Entry structure and define logging methods 46/184746/7
Lukasz Wojciechowski [Thu, 19 Jul 2018 16:31:28 +0000 (18:31 +0200)]
Add Entry structure and define logging methods

Entry structure defines a single log entity.

Entries are created by Logger with private newEntry method.
Centralization of creation:
* allows proper initialization of Logger field;
* opens possibility of adding entries pool in future implementation
    for optimization purposes;
* opens possibility of adding logger's context to entries in future
    implementation.

Logger functions: Emergency, Alert, Critical, Error, Warning, Notice,
Info, Debug create new Entries and log them using process method.
There are also formatted variants of these methods with "f" suffix,
e.g. Errorf.

Similar methods are defined on Entry type. Those methods also call
process method finalizing and logging enries. They are used in case
of finalizing Entries.
This will be useful in case of structured Entries containing properties
or errors. These will be provided by future commits.

The process method verifies if Entry's level pass logger's threshold
and completes Entry structure. In future commits it will pass Entry
to be logged by the Logger.

Change-Id: If7f3b5d251e03031f2fde48e33eae91aa89c8614
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoDefine initial version of Logger 45/184745/7
Lukasz Wojciechowski [Thu, 19 Jul 2018 12:30:28 +0000 (14:30 +0200)]
Define initial version of Logger

The new instance of a Logger can be created with NewLogger function.

It has one field: threshold defined, which is a general level for
the whole logger. Only more important log entries
(with lower Level value) will be processed by the Logger.

Patch defines SetThreshold and Threshold setter and getter
and a function PassThreshold for verification if entry level passes
Logger's threshold.

Change-Id: I3db0738dce2faef83f1e223c692465947f979535
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoDefine log levels 44/184744/6
Lukasz Wojciechowski [Wed, 18 Jul 2018 19:36:23 +0000 (21:36 +0200)]
Define log levels

This patch introduces logger's log levels, which match exactly
standard UNIX syslog log levels.

This patch also initializes a unit test suite for logger.
It is based on ginkgo and uses gomega for matching expressions.

Change-Id: I8c29746b3f4c5813a6b3f96b44570788e9bb49e6
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
5 years agoAdd Apache 2.0 license 67/184967/2
Lukasz Wojciechowski [Tue, 24 Jul 2018 13:43:44 +0000 (15:43 +0200)]
Add Apache 2.0 license

Change-Id: I7df9324231b2039d363508deaf47f74e90593821
Signed-off-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
6 years agoInitial empty repository acdc api dryad infra util
Tizen Infrastructure [Sat, 24 Mar 2018 00:48:26 +0000 (00:48 +0000)]
Initial empty repository