tests:samba_tool: pass stdout and stderr to assertCmdSuccess()
[nivanova/samba-autobuild/.git] / python / samba / tests / samba_tool / sites.py
1 # Unix SMB/CIFS implementation.
2 # Copyright (C) Catalyst.Net LTD 2015
3 # Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011
4 #
5 # Catalyst.Net's contribution was written by Douglas Bagnall
6 # <douglas.bagnall@catalyst.net.nz>.
7 #
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21
22 import os
23 import ldb
24 from samba.tests.samba_tool.base import SambaToolCmdTest
25 from samba import sites
26
27
28 class BaseSitesCmdTestCase(SambaToolCmdTest):
29     """Tests for samba-tool sites subnets"""
30     def setUp(self):
31         super(BaseSitesCmdTestCase, self).setUp()
32         self.dburl = "ldap://%s" % os.environ["DC_SERVER"]
33         self.creds_string = "-U%s%%%s" % (os.environ["DC_USERNAME"],
34                                           os.environ["DC_PASSWORD"])
35
36         self.samdb = self.getSamDB("-H", self.dburl, self.creds_string)
37         self.config_dn = str(self.samdb.get_config_basedn())
38
39
40 class SitesCmdTestCase(BaseSitesCmdTestCase):
41
42     def test_site_create(self):
43         sitename = 'new_site'
44
45         result, out, err = self.runsubcmd("sites", "create", sitename,
46                                           "-H", self.dburl, self.creds_string)
47         self.assertCmdSuccess(result, out, err)
48
49         dnsites = ldb.Dn(self.samdb, "CN=Sites,%s" % self.config_dn)
50         dnsite = ldb.Dn(self.samdb, "CN=%s,%s" % (sitename, dnsites))
51
52         ret = self.samdb.search(base=dnsites, scope=ldb.SCOPE_ONELEVEL,
53                                 expression='(dn=%s)' % str(dnsite))
54         self.assertEquals(len(ret), 1)
55
56         # now delete it
57         self.samdb.delete(dnsite, ["tree_delete:0"])
58
59
60 class SitesSubnetCmdTestCase(BaseSitesCmdTestCase):
61     def setUp(self):
62         super(SitesSubnetCmdTestCase, self).setUp()
63         self.sitename = "testsite"
64         self.sitename2 = "testsite2"
65         self.samdb.transaction_start()
66         sites.create_site(self.samdb, self.config_dn, self.sitename)
67         sites.create_site(self.samdb, self.config_dn, self.sitename2)
68         self.samdb.transaction_commit()
69
70     def tearDown(self):
71         self.samdb.transaction_start()
72         sites.delete_site(self.samdb, self.config_dn, self.sitename)
73         sites.delete_site(self.samdb, self.config_dn, self.sitename2)
74         self.samdb.transaction_commit()
75         super(SitesSubnetCmdTestCase, self).tearDown()
76
77     def test_site_subnet_create(self):
78         cidrs = (("10.9.8.0/24", self.sitename),
79                  ("50.60.0.0/16", self.sitename2),
80                  ("50.61.0.0/16", self.sitename2), # second subnet on the site
81                  ("50.0.0.0/8", self.sitename), # overlapping subnet, other site
82                  ("50.62.1.2/32", self.sitename), # single IP
83                  ("aaaa:bbbb:cccc:dddd:eeee:ffff:2222:1100/120",
84                   self.sitename2),
85              )
86
87         for cidr, sitename in cidrs:
88             result, out, err = self.runsubcmd("sites", "subnet", "create",
89                                               cidr, sitename,
90                                               "-H", self.dburl,
91                                               self.creds_string)
92             self.assertCmdSuccess(result, out, err)
93
94             ret = self.samdb.search(base=self.config_dn,
95                                     scope=ldb.SCOPE_SUBTREE,
96                                     expression=('(&(objectclass=subnet)(cn=%s))'
97                                                 % cidr))
98             self.assertIsNotNone(ret)
99             self.assertEqual(len(ret), 1)
100
101         dnsubnets = ldb.Dn(self.samdb,
102                            "CN=Subnets,CN=Sites,%s" % self.config_dn)
103
104         for cidr, sitename in cidrs:
105             dnsubnet = ldb.Dn(self.samdb, ("Cn=%s,CN=Subnets,CN=Sites,%s" %
106                                            (cidr, self.config_dn)))
107
108             ret = self.samdb.search(base=dnsubnets, scope=ldb.SCOPE_ONELEVEL,
109                                     expression='(dn=%s)' % dnsubnet)
110             self.assertIsNotNone(ret)
111             self.assertEqual(len(ret), 1)
112             self.samdb.delete(dnsubnet, ["tree_delete:0"])
113
114     def test_site_subnet_create_should_fail(self):
115         cidrs = (("10.9.8.0/33", self.sitename),    # mask too big
116                  ("50.60.0.0/8", self.sitename2),   # insufficient zeros
117                  ("50.261.0.0/16", self.sitename2), # bad octet
118                  ("7.0.0.0.0/0", self.sitename),    # insufficient zeros
119                  ("aaaa:bbbb:cccc:dddd:eeee:ffff:2222:1100/119",
120                   self.sitename),                   # insufficient zeros
121              )
122
123         for cidr, sitename in cidrs:
124             result, out, err = self.runsubcmd("sites", "subnet", "create",
125                                               cidr, sitename,
126                                               "-H", self.dburl,
127                                               self.creds_string)
128             self.assertCmdFail(result)
129
130             ret = self.samdb.search(base=self.config_dn,
131                                     scope=ldb.SCOPE_SUBTREE,
132                                     expression=('(&(objectclass=subnet)(cn=%s))'
133                                                 % cidr))
134
135             self.assertIsNotNone(ret)
136             self.assertEqual(len(ret), 0)